9

在scala中编写以下代码时

var m = Map((0,1) -> "a")
m += ((0,2), "b") // compilation error

我收到错误

类型不匹配;
 找到 : Int(0)
 必需:(整数,整数)

然而,将元组的语法从(X,Y)to更改为(X -> Y)有效

var m = Map((0,1) -> 'a)
m += ((0,2) -> 'b) // compiles file

虽然

((0,1).getClass == (0 -> 1).getClass) // is true
(0,1).isInstanceOf[Tuple2[_,_]] && (0 -> 1).isInstanceOf[Tuple2[_,_]] // both true

这是为什么?scala 认为我的嵌套元组是什么?

4

2 回答 2

10

原因很简单(我认为)并且与(关于Map特征)的事实有关:

m += (a -> b)

是以下的简写:

m = m.+(t2) //where t2 is of type Tuple2[A,B]

显然,如果您在第一个示例中使用逗号,Scala 会将其解释为对方法的调用:

m = m.+(a, b)

特征上不存在此方法Map。方法调用规则意味着a -> b首先被评估(到Tuple2),因此调用正确的方法。注意:使用额外的一对括号就可以了:

m += ( (a,b) ) //works just fine but less readable
于 2009-09-08T16:18:50.467 回答
0

牛弓是正确的。不过,您可以使用另一个括号来消除歧义:

m += (((0,2), "b"))
于 2009-09-08T18:36:59.890 回答