Programing

Scala에서 함수를 정의하는 세 가지 방법의 차이점

lottogame 2020. 8. 31. 08:17
반응형

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하는 식 평가하지 않습니다 전자 . 대신 ex 가 사용될 때마다 평가 됩니다. 선택적으로, 스칼라 값 정의 구비 브로 X = E 오른쪽 측 평가 않고 , 즉 정의의 일부로서 평가한다. x 가 이후에 사용 되면 즉시 미리 계산 된 e 값으로 대체 되므로 식을 다시 평가할 필요가 없습니다.

Scala By Example by Martin Odersky

참고 URL : https://stackoverflow.com/questions/3646756/differences-between-these-three-ways-of-defining-a-function-in-scala

반응형