Scala Language
기능들
수색…
비고
스칼라에는 일류 함수가있다.
함수와 메소드의 차이점 :
함수는 스칼라의 한 메소드가 아닙니다 : 함수는 값이며, 그 자체로 할당 될 수 있습니다. 반면에 def
( def
사용하여 만든 메소드)는 클래스, 특성 또는 객체에 속해야합니다.
- 함수는 컴파일 타임에 특성 (예 :
Function1
)을 확장하는 클래스로 컴파일되고 런타임에 값으로 인스턴스화됩니다. 다른 한편으로, 방법은 그들의 계급, 특성 또는 대상의 구성원이며, 그 밖에 존재하지 않습니다. - 메서드가 함수로 변환 될 수는 있지만 함수를 메서드로 변환 할 수는 없습니다.
- 메소드는 타입 매개 변수화를 가질 수 있지만 함수는 그렇지 않습니다.
- 메서드는 매개 변수 기본값을 가질 수 있지만 함수는 매개 변수 기본값을 가질 수 없습니다.
익명 함수
익명 함수는 정의되었지만 이름이 지정되지 않은 함수입니다.
다음은 두 개의 정수를 취하여 합을 반환하는 익명의 함수입니다.
(x: Int, y: Int) => x + y
결과 표현식을 val
할당 할 수 있습니다.
val sum = (x: Int, y: Int) => x + y
익명 함수는 주로 다른 함수의 인수로 사용됩니다. 예를 들어, 콜렉션의 map
함수는 다른 함수를 인수로 기대합니다.
// Returns Seq("FOO", "BAR", "QUX")
Seq("Foo", "Bar", "Qux").map((x: String) => x.toUpperCase)
익명의 함수의 인수 타입은 생략 될 수 있습니다. 타입은 자동으로 유추됩니다 :
Seq("Foo", "Bar", "Qux").map((x) => x.toUpperCase)
인수가 하나만있는 경우 해당 인수 주변의 괄호를 생략 할 수 있습니다.
Seq("Foo", "Bar", "Qux").map(x => x.toUpperCase)
밑줄은 속기
인수의 이름을 필요로하지 않는 더 짧은 구문이 있습니다. 위의 발췌 문장은 다음과 같이 작성할 수 있습니다.
Seq("Foo", "Bar", "Qux").map(_.toUpperCase)
_
는 익명의 함수 인수를 위치 적으로 나타냅니다. 여러 매개 변수가있는 익명의 함수로 _
이 나타날 때마다 다른 인수를 참조합니다. 예를 들어, 다음 두 표현식은 동일합니다.
// Returns "FooBarQux" in both cases
Seq("Foo", "Bar", "Qux").reduce((s1, s2) => s1 + s2)
Seq("Foo", "Bar", "Qux").reduce(_ + _)
이 속기를 사용할 때, 위치 _
표시되는 인수는 동일한 순서로 한 번만 참조 될 수 있습니다.
매개 변수가없는 익명의 함수
매개 변수를 사용하지 않는 익명 함수의 값을 만들려면 매개 변수 목록을 비워 둡니다.
val sayHello = () => println("hello")
구성
기능 구성은 두 가지 기능이 작동하고 단일 기능으로 간주되도록합니다. 수학적 용어로 표현하면, 함수 f(x)
와 함수 g(x)
주어진다면, 함수 h(x) = f(g(x))
이다.
함수가 컴파일되면 Function1
과 관련된 유형으로 컴파일됩니다. Scala는 composition : andThen
및 compose
와 관련된 Function1
구현에서 두 가지 메소드를 제공합니다. compose
메소드는 위의 수학적 정의와 다음과 같이 적합합니다.
val f: B => C = ...
val g: A => B = ...
val h: A => C = f compose g
andThen
( h(x) = g(f(x))
)는 'DSL 식'느낌이 더 andThen
.
val f: A => B = ...
val g: B => C = ...
val h: A => C = f andThen g
새로운 익명의 함수는 f
와 g
통해 닫힌 상태로 할당됩니다. 이 함수는 두 경우 모두 새로운 함수 h
에 바인딩됩니다.
def andThen(g: B => C): A => C = new (A => C){
def apply(x: A) = g(self(x))
}
f
또는 g
중 하나가 부작용을 통해 작동하면 h
를 호출하면 f
및 g
의 모든 부작용이 순서대로 발생합니다. 동일한 변경 가능한 상태 변화에 대해서도 마찬가지입니다.
PartialFunctions와의 관계
trait PartialFunction[-A, +B] extends (A => B)
모든 단일 인수 PartialFunction
은 Function1
이기도합니다. 이는 공식 수학적 의미에서 반 직관적이지만 객체 지향 디자인에 더 적합합니다. 이러한 이유로 Function1
은 상수 인 true
isDefinedAt
메소드를 제공 할 필요가 없습니다.
부분 함수 (함수이기도 함)를 정의하려면 다음 구문을 사용합니다.
{ case i: Int => i + 1 } // or equivalently { case i: Int ⇒ i + 1 }
자세한 내용은 PartialFunctions를 살펴 보십시오 .