복붙노트

[SCALA] 스칼라의 인수로 여러 줄 함수 리터럴

SCALA

스칼라의 인수로 여러 줄 함수 리터럴

나는 항상 우리가 여러 문장에 대해서도 중괄호를 무시할 수없는 이유 때때로 함수 리터럴 궁금. 이를 설명하기 위해, 여러 줄 함수 리터럴의 구문은 중괄호로 문을 둘러싸입니다. 같은,

val fl = (x: Int) => {
  println("Add 25 to "+x)
  x + 25
}

그러나, 당신은 하나의 인수 함수에 통과 할 때, 당신은 함수 리터럴에 필요한 중괄호를 무시할 수 있습니다.

따라서 소정의 함수 f에 대한,

def f( fl: Int => Int ) {
  println("Result is "+ fl(5))
}

당신은이 같은 F ()를 호출 할 수 있습니다

f( x=> {
  println("Add 25 to "+x)
  x + 25
})
-------------------------
Add 25 to 5
Result: 30

당신은 함수 호출에 괄호 대신 중괄호를 사용하는 경우 또는, 당신은 함수 리터럴에서 내부 중괄호를 제거 할 수 있습니다. 다음 코드 그래서 것이다 또한 작업,

f{ x=>
  println("Add 25 to "+x)
  x + 25
}

위의 코드는 더 읽기와 나는 많은 예제는이 구문을 사용하는 것을 알 수 있습니다. 그러나, 나는 놓친 수 있다는 특별한 규칙이 의도 노력으로 이유를 설명 할 수 있는가?

해결법

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

    1.간단한 문법 규칙의 단지 몇 가지 있습니다. 스펙의 부록 가치를 숙독입니다.

    간단한 문법 규칙의 단지 몇 가지 있습니다. 스펙의 부록 가치를 숙독입니다.

    함수 리터럴 또는 익명 함수 (6.23)의 각각의 컨텍스트는 EXPR 또는 ResultExpr인지에 따라 X => EXPR 또는 X => 차단 같을 것이다.

    기능 프로그램 (6.6), 즉 F (EXPR, EXPR)처럼 또는 BlockExpr f를 보이는 것, F {} 블록. 즉하는 BlockExpr는 {...} 내부 블록 일련의 문장이다.

    만약 F (g)를 호출 할 때, g 정도로 함수 리터럴, X => EXPR 같이 expr이있다. expr의 BlockExpr가 될 수 X => {...}.

    당신이 {차단} f를 호출 할 때, f를 {X => ...} 블록의 ResultExpr에서 함수 리터럴이 (단지 문장의 순서이며, 더 중괄호는 필요 없음).

    여기서,는 익명의 FUNC가 블록의 맨 아래에 있음을 분명 :

    scala> def m(x: Int=>Int) = x(5)
    m: (x: Int => Int)Int
    
    scala> m {
         | val y = 7
         | x => // no brace
         | x+y+1
         | }
    res0: Int = 13
    
  2. ==============================

    2.이것은 나에게 스칼라 아름다운 만드는 것들 중 하나입니다.

    이것은 나에게 스칼라 아름다운 만드는 것들 중 하나입니다.

    귀하의 질문에 대한 대답은 간단하다 :

    괄호 () 한 줄의 구조에 대한 의미한다. 예를 들어,이 작품 :

      def f(fl: Int => Int) {
        println("Result is " + fl(5))
      }
    
      f(
       x =>
        x + 25)
    
      f(x => x + 25) // single line
    

    중괄호는 {} 여러 문에 대한 의미가있다. 예를 들어,이 작품 :

     f { 
       x =>
         println("Add 25 to " + x)
         x + 25
     }   
    

    하지만이 코드는 작동하지 않습니다

    f ( 
      x =>
        println("Add 25 to " + x)
        x + 25
    )
    

    컴파일러는 다음 메시지와 함께 불평 :

    당신은 세미콜론을 추가하는 경우, 당신은 타의 추종을 불허하는 괄호로 인한 구문 오류가 발생합니다.

    이 작업을 수행하려고하면 :

    f { x => println("Add 25 to " + x) x + 25 }
    

    컴파일러는 메시지와 함께 당신에게 다시 얻을 것이다 :

    value x is not a member of unit
    

    당신은 그가 단위의 구성원으로 X를 찾기 위해 노력하고 있음을받을 수 있나요. 처럼:

    f { println("Add 25 to " + x).x.+(25) }
    

    어느 분명히 잘못된 것입니다.

    이처럼 내부 중괄호를 추가하는 경우 :

    f ( 
      x => {
        println("Add 25 to " + x)
        x + 25 
      }
    )
    

    이 작품은 것입니다,하지만 당신은 여전히 ​​중괄호의 사용에 의해 신호되는 여러 문이있다. 컴파일러는 당신이 원하는 것을 알 수 있도록이 첫 번째 인쇄하는 것입니다 후 X 25을 추가합니다.

    나는 그 미묘한 차이에 의해 전에 물린했습니다. 당신은 코드와 주로지도, flatMaps, foreachs, FORS 및 무두질을 사용할 때이 많이 읽을 것이기 때문에 이후로, 나는 그와 방식 I 코드에 주목했습니다.

    건배!

  3. from https://stackoverflow.com/questions/13872196/multiline-function-literal-as-arguments-in-scala by cc-by-sa and MIT license