解析错误
当斯卡拉写下面的代码解析错误
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认为我的嵌套元组是什么?
原因很简单(我认为),是与事实这样做(在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
实际上,我是很肯定的OBJ欧普强的松相当于Pred.Op((强的松))了。用(在标准库或Lift中)调用带有两个参数的函数作为操作符吗? (一个有意义的例子,你可以随时做“数组更新(x,y)”,但它看起来很奇怪。 – 2009-09-09 03:59:43
我同意你的意见Elazar。我认为编译器应该有更多的意义 – 2009-09-09 09:21:25
故道是正确的。您可以使用其他括号来消除歧义,但:
m += (((0,2), "b"))
我相信我指出额外的括号解决了这个问题 – 2009-09-09 09:28:57
我*始终*犯同样的错误 – 2009-09-08 16:08:24