2012-05-06 3 views
0

다음 함수 호출이 모두 같음을 알지만 왜 그런지 이해하지 못합니다.Scala는 다른 형식의 함수 호출을 어떻게 이해할 수 있습니까?

val list = List(List(1), List(2, 3), List(4, 5, 6)) 

list.map(_.length) // res0 = List(1,2,3) result of 1st call 

list map(_.length) // res1 = List(1,2,3) result of 2nd call 

list map (_.length) // res2 = List(1,2,3) result of 3rd call 

지도 클래스 목록

의 멤버 함수이기 때문에 난 그냥 일반 함수 호출 첫번째 호출을 이해할 수있다하지만 2 층과 3 전화를 이해할 수 없습니다. 예를 들어, 세 번째 호출에서 스칼라 컴파일러는 "(_.length)"가 "map"의 매개 변수라는 것을 어떻게 알 수 있습니까? 컴파일러는 "map"이 "list"의 멤버 함수라는 것을 어떻게 알 수 있습니까?

답변

2

변형 2와 3 사이의 유일한 차이는 괄호 앞의 공백? 이것은 단락 문자 일 수 있습니다 - list alista은 물론 다르지만 여는 괄호는 새로운 토큰입니다. 공백을 넣거나 앞뒤에 공백을 둘 수 있습니다. 여기 어떻게 다른 점을 기대할 수 있는지 모르겠습니다.

는 자바에서 너무

System.out.println ("foo"); 

// 및

System.out.println("foo"); 

사이에는 차이가 없다.

+0

@LuigiPlinge : 오, 그래, 고마워. 그건 내 잘못한 의견이었습니다. 그것을 제거했다. –

0

이것은 운영자 표기법입니다. 그 이유는 2 + 2이 작동하는 것과 같은 이유입니다.

공백은 단어를 구별하는 데 사용됩니다. listmap(_.length)은 컴파일러가 listmap을 찾도록 만듭니다. 하지만 list++list으로 작성하면 list ++ list처럼 작동합니다. 그래서

, 당신이 운영자 표기법을 사용하여 하나는 공간이 단어를 분리 할 필요가있다하지만, 그 존재 여부 될 수있다.

관련 문제