2013-03-01 1 views
1

나는 다음지도가 있다고 가정스칼라지도 + = 운영

import scala.collection.mutable._ 
val countries = Map[String, String](
    ("Paris", "France"), 
    ("Washington", "USA"), 
    ("London", "England") 
) 

가 그럼 난 (내가 명령 행 인수의 값을 얻을)이지도에 어떤 값을 추가하려고를 :

countries += (args(0), args(1)) 

그러나 위의 코드는 말을 컴파일하지 않는 나는 변경하면

found : String 
required: (String, String) 

0123에
countries += ((args(0), args(1))) 

또는

countries += (args(0) -> args(1)) 

-는 다음 성공적으로 컴파일합니다. 컴파일러가 첫 번째 경우 튜플을 인식하지 못하는 이유는 무엇입니까?

답변

5

:

DEF + = (elem1 (A, B), elem2 (A, B), elems (A, B) *) Map.this.type 은이 축소 가능한 컬렉션에 둘 이상의 요소를 추가합니다.

즉, 한 번에 여러 요소를 추가 할 수있는 +=의 오버로드 된 버전이 있습니다. 당신의 예제는 (여러 인자에 대한 일반적인 규칙을 사용하여) 그렇게하려고하는 것처럼 보입니다. 단, 각각의 인자가 잘못된 타입이라고 불평한다는 점만 제외하면 말입니다.

+0

하지만 왜 그 방법을 사용하려고합니까? 필자가 알고있는 한 방법은 점 표기법없이 (그리고 매개 변수에 대한 paranthese없이) 사용할 수있는 것보다 하나의 인수 만 사용하는 경우를 알 수 있습니다. 내 경우에는 점 표기법을 사용하지 않고 + = 메서드를 사용하므로 다음 문은 2 개 값의 튜플 인 단일 매개 변수를 나타냅니다. – maks

+2

점 표기법없이 무언가를 사용할 수있는 경우에는 이러한 제한이 없습니다. 예를 들면 :'A (def a (x : Int, y : int) = x + y}','A (1,2)'는 완벽하게 유효하며 예상대로 작동합니다. 예제의 첫 번째 괄호는 인수 목록의 시작과 같습니다. – Impredicative

+4

@maks 혼란 스러울 수있는 점은 또한 하나의 튜플 arg가 예상되는 곳에 여러 개의 arg를 전달하면 해당 args가 컴파일러에 의해 하나의 튜플에 래핑되는 * 튜플 프로모션 *이 있다는 것입니다. 그러므로'A'는 다른 (오버로드 된) 객체가 없으면'A (def) (x : (Int, Int)) = x._1 + x._2}') 메소드'a'는 2 args를 취하는데,이 경우에는 대신 호출됩니다. –

1

컴파일러는 두 개의 매개 변수를 전달하고 첫 번째 괄호를 매개 변수 목록의 구분 기호로 해석한다고 생각했습니다. Scaladoc 가입일