2013-08-05 2 views
0

테이크 _의 한계 : 그와스칼라 :

var data = List[(DateTime, Double)]() 
val pairs = io.Source.fromInputStream(getClass.getResourceAsStream("/data.csv")).getLines().map(_.split(",")) 
pairs.foreach(pair => data ::= (dateFormatter.parseDateTime(pair(0)), pair(1).toDouble)) 

문제가 없습니다. 쌍을 선언하는 대신 매개 변수 자리 표시자를 사용하기로 결정한 경우 다음과 같이합니다.

pairs.foreach(data ::= (dateFormatter.parseDateTime(_(0)), _(1).toDouble)) 

컴파일러는이를 사용하지 않습니다. 또한 오류 :

too many arguments for method ::: (x: B)List[B] 
pairs.foreach(data ::= (dateFormatter.parseDateTime(_(0)), _(1).toDouble)) 
       ^

은별로 도움이되지 않습니다. 여기서 무슨 일이 일어나고있는거야? 나는 하나 이상의 매개 변수를 표현하기 위해 밑줄을 사용할 수는 없지만 여기서는 하나의 매개 변수에 대해서만 사용하고 있다는 것을 이해합니다. 나는 컴파일러가 이것을 받아 들일 수없는 이유를 모르거나 호출되지 않는 메소드 :::에 대한 참조를 이해하지 못한다.

답변

5

클로저의 밑줄은 선언 순서에서 클로저의 매개 변수를 나타내며 동일한 매개 변수를 참조하는 데 사용할 수 없습니다.

컴파일러 오류와 관련하여 ::이 아니라 :::을 참조합니다. 세 번째 콜론은 메서드 이름이 아니라 오류 메시지의 일부입니다! assignment operator::=으로 인해 호출되었습니다.

1

매개 변수 자리 표시 자 _은 각 매개 변수에 최대 한 번 사용할 수 있습니다.

첫 번째 매개 변수는 첫 번째 매개 변수에 매핑되고 두 번째 매개 변수는 두 번째 매개 변수에 매핑되는 식으로 나타납니다. 매개 변수보다 '_'가 더 많으면 컴파일 문제가 될 수 있습니다.