2013-03-01 206 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

编译器认为您传递了两个参数,并将您的第一个圆括号解释为参数列表的分隔符。