首页 文章

解析scala中嵌套元组的错误

提问于
浏览
9

在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 回答

  • 10

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

    m += (a -> b)
    

    是简写:

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

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

    m = m.+(a, b)
    

    Map Map 特征 . 方法调用规则意味着首先评估 a -> b (到 Tuple2 ),因此调用正确的方法 . Note: 使用一对额外的括号可以正常工作:

    m += ( (a,b) ) //works just fine but less readable
    
  • 0

    Oxbow是正确的 . 但是,您可以使用另一个括号来消除歧义:

    m += (((0,2), "b"))
    

相关问题