8
val m = scala.collection.mutable.Map[String, Int]()
// this doesn't work
m += ("foo", 2)
// this does work
m += (("foo", 2))
// this works too
val barpair = ("bar", 3)
m += barpair

それで、m += ("foo" , 2)うまくいかないのはどういうことですか?Scala は型エラーを返します:

 error: type mismatch;
 found   : java.lang.String("foo")
 required: (String, Int)
       m += ("foo", 2)
             ^

+=どうやら Scala は、1 つのタプル引数ではなく、2 つの引数で呼び出そうとしていると考えているようです。なんで?を使用していないので、明確ではありませんm.+=か?

4

3 に答える 3

10

残念ながらa b (c, d, e, ..)に脱糖しa.b(c, d, e, ..)ます。したがって、エラー。

于 2011-10-12T17:54:43.013 に答える
4

m.+= を使用していないので、明確ではありませんか?

いいえ、そうではありません。複数の引数がある場合はいつでも括弧を使用できるからです。例えば:

List(1, 2, 3) mkString ("<", ", ", ">")

それで、あなたは尋ねるかもしれません、何の複数のパラメータですか?さて、Scala API のドキュメントはあなたの友人 (または少なくとも私の友人) なので、以下を紹介します。

scala> val m = scala.collection.mutable.Map[String, Int]()
m: scala.collection.mutable.Map[String,Int] = Map()

scala> m += (("foo", 2), ("bar", 3))
res0: m.type = Map(bar -> 3, foo -> 2)

つまり、+=vararg を取ります。

于 2011-10-12T21:21:50.523 に答える
2

マップ エントリを定義する推奨される方法は、-> メソッドを使用することです。お気に入り

m += ("foo" -> 2)

タプルを構築します。a -> b は a.->(b) に脱糖されます。scala のすべてのオブジェクトには -> メソッドがあります。

于 2011-10-12T18:08:27.620 に答える