복붙노트

[SCALA] 익명 함수를 정의하기 위해 밑줄을 결정할 수있는 규칙은 무엇입니까?

SCALA

익명 함수를 정의하기 위해 밑줄을 결정할 수있는 규칙은 무엇입니까?

나는 익명 함수를 작성하기위한 자리로 _ 사용하고, 그리고 문제는 내가 스칼라 내 코드를 변환하는 것입니다 방법을 예측할 수있다. 더 정확하게, 그것은 실수로 익명 함수 내가 원하는 방법 "큰"결정합니다.

 List(1,2,3) foreach println(_:Int)   //error !
 List(1,2,3) foreach (println(_:Int)) //work
 List(1,2,3) foreach(println(_:Int))  //work

-Xprint 사용 : 내가 스칼라 변환 "큰 익명 함수"로 첫 번째를 볼 수 있습니다 TYPER :

x$1 => List(1,2,3) foreach(println(x$1:Int))

피 가공 2 일 제 3 회 내가 원하는 무엇으로 바로 변환됩니다.

... foreach (x$1 => println(x$1:Int)) 

왜? 규칙은 무엇입니까?

해결법

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

    1.간단한 규칙은 밑줄의 범위를 결정하기 :

    간단한 규칙은 밑줄의 범위를 결정하기 :

    따라서, 규칙 # 1 대신에 println의하여 ((X : INT) => x)가 상기 범위에 println (포함) 밖에 배치한다.

    규칙 # 2, 후자의 두 가지 예는 괄호로 구분 함수이므로 (: INT) X =>에 println (X)를 가질 것이다.

    더 리미팅 괄호가없는 같은 규칙 # 3에 의해, 첫 번째 예는, 전체 표현 될 것이다.

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

    2.씨 소브랄의 대답은 잘못된 생각합니다. 실제 규칙은 "익명 함수에 대한 자리 표시 자 구문."스칼라 언어 참조 섹션 6.23, 부제에서 찾을 수 있습니다

    씨 소브랄의 대답은 잘못된 생각합니다. 실제 규칙은 "익명 함수에 대한 자리 표시 자 구문."스칼라 언어 참조 섹션 6.23, 부제에서 찾을 수 있습니다

    유일한 규칙은 제대로 밑줄을 포함하는 가장 안쪽 식 익명 함수의 범위를 정의하는 것입니다. 그 메소드 호출은 표현과 표현을 parenthesizing 것은 그 의미를 변경하지 않기 때문에 씨 소브랄의 처음 두 규칙이 올바른지 수단 것이다. 그러나 세 번째 규칙은 진실의 반대 : 다른 모든 조건이 동일, 의미가 가장 작은 표현이 사용됩니다.

    불행하게도, 씨 Laskowski는 자신의 첫 번째 예를 들어 관찰 된 행동에 대한 내 설명이 약간 참여하고 투기입니다. 언제

    List(1,2,3) foreach println(_:Int)
    

    스칼라에 입력 된 읽기 평가 후면 인쇄 루프를. 오류 메시지는 다음과 같습니다

    error: type mismatch;
     found   : Unit
     required: Int => ?
                  List(1,2,3) foreach println(_:Int)
                                             ^
    

    당신은 예에게 작은 비트를 변경하는 경우 :

    List(1,2,3).foreach println(_:Int)
    

    오류 메시지의 메이크업 감각에 쉽게 -

    error: missing arguments for method foreach in class List;
    follow this method with `_' if you want to treat it as a partially applied function
              List(1,2,3).foreach println(_:Int)
                          ^
    

    좀 더 나은 일을 이해하기 위해 호출 스칼라 따라서 : 스칼라 -Xprint : 모든 표현은 사용자가 입력 한 후, 파서에 의해 구체화로 표현 원인 파서는, 인쇄 할 수 있습니다. Laskowski의 첫 번째 예를 들어 (쓰레기, I는 생략 할 수 있습니다. 많은과 함께), 표현 파서에 의해 이해입니다

    ((x$1: Int) => List(1, 2, 3).foreach(println((x$1: Int))))
    

    두 번째 예를 들어, 파서의 버전입니다

    ((x$1: Int) => List(1, 2, 3).foreach.println((x$1: Int)))
    

    식 구조가 완전히 구체화되기 전에 분명히 범위 규칙이 적용됩니다. 두 경우 모두, 파서 추측은 작은 표현식은 괄호가 더 이상 진실이의 삽입되면, 비록 목록에서 시작 없다. 이에 println의 Foreach에 println 식별자 인 방법 체인 때문에 두 번째 예에서, 그 이외에 가정에 가장 먼저 인수가없는, 즉 가정한다. foreach 문에서이 오류는 다음 마스킹에 println에 오류 전에 잡은된다. 에 println에서 오류가 그 결과 단위이며, foreach는이 기능을 필요로한다는 것이다. 당신이 파스 트리를 참조하면,이 올바른지 쉽게 알 수 있지만, 파스 트리 그것이 무엇이고 왜 (나에게) 분명하지 않다.

  3. from https://stackoverflow.com/questions/28125850/what-are-the-rules-to-govern-underscore-to-define-anonymous-function by cc-by-sa and MIT license