[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 대신에 println의하여 ((X : INT) => x)가 상기 범위에 println (포함) 밖에 배치한다.
규칙 # 2, 후자의 두 가지 예는 괄호로 구분 함수이므로 (: INT) X =>에 println (X)를 가질 것이다.
더 리미팅 괄호가없는 같은 규칙 # 3에 의해, 첫 번째 예는, 전체 표현 될 것이다.
-
==============================
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는이 기능을 필요로한다는 것이다. 당신이 파스 트리를 참조하면,이 올바른지 쉽게 알 수 있지만, 파스 트리 그것이 무엇이고 왜 (나에게) 분명하지 않다.
from https://stackoverflow.com/questions/28125850/what-are-the-rules-to-govern-underscore-to-define-anonymous-function by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 왜 NullPointerException이에서 UDF 결과에서 DataFrame를 accesing? (0) | 2020.02.08 |
---|---|
[SCALA] 선물 / 성공 경주 (0) | 2020.01.24 |
[SCALA] 계산 코사인 유사성 스파크 Dataframe (0) | 2020.01.15 |
[SCALA] 어떻게 스칼라에서 문자열 "+"연산자를 unimport하는? (0) | 2020.01.11 |
[SCALA] 어떻게 스파크에서 여러 열로 배열을 폭발 (0) | 2020.01.09 |