반응형
Scala에서 함수를 정의하는 세 가지 방법의 차이점
동일한 기능을 표현하는 세 가지 방법이 주어집니다 f(a) := a + 1
.
val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
이러한 정의는 어떻게 다릅니 까? REPL은 명백한 차이점을 나타내지 않습니다.
scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
f1
정수를 취하고 정수를 리턴하는 함수입니다.
f2
정수를 취하고 정수를 반환하는 함수를 반환하는 arity가 0 인 메서드입니다. ( f2
나중에 REPL에 입력 하면 메서드에 대한 호출이됩니다 f2
.)
f3
과 동일합니다 f2
. 유형 추론을 사용하지 않습니다.
클래스 내 val
에서 초기화시 평가되는 반면는 함수가 호출 def
될 때 마다 평가됩니다 . 아래 코드에서 객체가 처음 사용될 때 x가 평가되지만 x 멤버에 액세스 할 때 다시 평가되지 않음을 알 수 있습니다. 반대로 y는 개체가 인스턴스화 될 때 평가되지 않지만 멤버에 액세스 할 때마다 평가됩니다.
class A(a: Int) {
val x = { println("x is set to something"); a }
def y = { println("y is set to something"); a }
}
// Prints: x is set to something
val a = new A(1)
// Prints: "1"
println(a.x)
// Prints: "1"
println(a.x)
// Prints: "y is set to something" and "1"
println(a.y)
// Prints: "y is set to something" and "1"
println(a.y)
같은 정의를 실행 데프 X = E하는 식 평가하지 않습니다 전자 . 대신 e 는 x 가 사용될 때마다 평가 됩니다. 선택적으로, 스칼라 값 정의 구비 브로 X = E 오른쪽 측 평가 않고 , 즉 정의의 일부로서 평가한다. x 가 이후에 사용 되면 즉시 미리 계산 된 e 값으로 대체 되므로 식을 다시 평가할 필요가 없습니다.
Scala By Example by Martin Odersky
반응형
'Programing' 카테고리의 다른 글
내일 날짜를 얻는 가장 깨끗하고 파이썬적인 방법? (0) | 2020.08.31 |
---|---|
Ruby에서 메서드 인수에 액세스하는 방법이 있습니까? (0) | 2020.08.31 |
조건부 판다 교체 (0) | 2020.08.31 |
Windows에서 pip 설치 액세스가 거부되었습니다. (0) | 2020.08.31 |
Git의 diff 출력에서 "@@ -1 +1 @@"은 무엇을 의미합니까? (0) | 2020.08.30 |