2013-03-01 150 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) 

當我改變,要

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

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

那麼它編譯成功。爲什麼編譯器在第一種情況下不能識別元組?

回答

5

Scaladoc

DEF + =(elem1:(A,B),elem2時:(A,B),elems的:(A,B)*):Map.this.type 將兩個或多個元素添加到此可收縮集合中。

換句話說,有一個+=的重載版本,允許您一次添加多個元素。你的例子看起來像它試圖做到這一點(對多個參數使用常規約定),除了它正在抱怨(正確),每個參數都是錯誤的類型。

+0

但爲什麼它嘗試使用該方法?據我所知,當一個方法只有一個參數,而不是沒有點符號的情況下使用(也沒有參數的參數)。在我的情況下,我使用方法+ =沒有點符號,所以下一條語句指出一個單個參數,它是一個2值的元組 – maks 2013-03-01 13:16:41

+2

沒有這種限制,什麼時候可以使用沒有點符號的東西。例如:'對象A {def a(x:Int,y:Int)= x + y}',a a(1,2)'是完全有效的並且按預期工作。您示例中的第一個括號看起來像參數列表的開始。 – Impredicative 2013-03-01 13:20:48

+4

@maks可能令人困惑的是,還有一些叫做(我認爲)的元組升級*,如果你傳遞了多個參數,這些參數需要單個元組arg,那麼這些參數將被編譯器包裝成一個元組。因此'對象A {def a(x:(Int,Int))= x._1 + x._2}'那麼'a a(1,2)'也可以工作......除非'A'有另一個)方法'a'需要2個參數,在這種情況下被調用。 – 2013-03-01 14:54:42

1

編譯器認爲您傳遞了兩個參數,並將您的第一個圓括號解釋爲參數列表的分隔符。