Ela*_*ich 9 syntax scala tuples
在scala中编写以下代码时
var m = Map((0,1) -> "a")
m += ((0,2), "b") // compilation error
Run Code Online (Sandbox Code Playgroud)
我收到了错误
type mismatch; found : Int(0) required: (Int, Int)
然而,将元组的语法从改变(X,Y)为(X -> Y)工作
var m = Map((0,1) -> 'a)
m += ((0,2) -> 'b) // compiles file
Run Code Online (Sandbox Code Playgroud)
即使
((0,1).getClass == (0 -> 1).getClass) // is true
(0,1).isInstanceOf[Tuple2[_,_]] && (0 -> 1).isInstanceOf[Tuple2[_,_]] // both true
Run Code Online (Sandbox Code Playgroud)
这是为什么?scala认为我的嵌套元组是什么?
oxb*_*kes 10
原因很简单(我认为)并且与(在Map特质上)事实有关:
m += (a -> b)
Run Code Online (Sandbox Code Playgroud)
是简写:
m = m.+(t2) //where t2 is of type Tuple2[A,B]
Run Code Online (Sandbox Code Playgroud)
显然,如果您在第一个示例中使用逗号,Scala会将此解释为对方法的调用:
m = m.+(a, b)
Run Code Online (Sandbox Code Playgroud)
这种方法不存在的Map特质.方法调用规则意味着a -> b首先评估(到Tuple2),因此调用正确的方法.注意:使用一对额外的括号可以正常工作:
m += ( (a,b) ) //works just fine but less readable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |