복붙노트

[SCALA] 스칼라 함수를 정의의이 세 가지 방법의 차이

SCALA

스칼라 함수를 정의의이 세 가지 방법의 차이

= A + 1 : 동일한 함수 f (a)를 표현하는 세 가지 주어 :

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>

해결법

  1. ==============================

    1.F1은 정수를 취해 정수를 리턴하는 함수이다.

    F1은 정수를 취해 정수를 리턴하는 함수이다.

    F2를 반환하는 제로 인수에 대응하는 정수 복귀 정수를 취하는 함수로하는 방법이다. (나중에 REPL F2에 입력되면, 상기 방법은 F2 호출된다).

    F3은 F2와 동일하다. 당신은 그냥 형식 유추를 사용하지 않는.

  2. ==============================

    2.클래스 내부 데프 경우에만 평가하면서, 발은 초기에 평가하고, 때마다 함수가 호출됩니다. 그 X를 볼 수 있습니다 당신이 아래의 코드에서 개체가 처음 사용될 때 평가됩니다,하지만 다시 X의 멤버에 액세스 할 때. 대조적으로, Y는 오브젝트가 인스턴스화 될 때 평가되는 것이 아니라 부재를 액세스 할 때마다 평가된다.

    클래스 내부 데프 경우에만 평가하면서, 발은 초기에 평가하고, 때마다 함수가 호출됩니다. 그 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)
    
  3. ==============================

    3.이러한 DEF X = E로서 정의 실행

    이러한 DEF X = E로서 정의 실행

  4. from https://stackoverflow.com/questions/3646756/differences-between-these-three-ways-of-defining-a-function-in-scala by cc-by-sa and MIT license