9

次のコードをscalaで書くとき

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

エラーが発生します

型の不一致;
 見つかった:Int(0)
 必須:(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は私のネストされたタプルは何だと思いますか?

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 に答える