在scala中编写以下代码时
var m = Map((0,1) -> "a")
m += ((0,2), "b") // compilation error
我收到了错误
type mismatch;
found : Int(0)
required: (Int, Int)
但是,将元组的语法从 (X,Y)
更改为 (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认为我的嵌套元组是什么?
2 回答
原因很简单(我认为)并且与(在
Map
特征上)事实有关:是简写:
显然,如果您在第一个示例中使用逗号,Scala会将此解释为对方法的调用:
Map
Map
特征 . 方法调用规则意味着首先评估 a -> b (到Tuple2
),因此调用正确的方法 . Note: 使用一对额外的括号可以正常工作:Oxbow是正确的 . 但是,您可以使用另一个括号来消除歧义: