1

Scala REPLは、両方の式に同じ型を与えます-(タプル?-奇妙な!)。しかし、("a" ->1)これは私がマップに追加できるマップであり、追加("a", 1)できないマップです。Scala REPLがマップ式のタプル型タイプを表示するのはなぜですか?

scala> :t ("a" -> 1)
(String, Int)

scala> :t ("a",1)
(String, Int)

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

scala> m + ("a",1)
<console>:9: error: type mismatch;
 found   : String("a")
 required: (String, ?)
          m + ("a",1)
           ^

scala> m + ("a" ->1)
res19: scala.collection.immutable.Map[String,Int] = Map(a -> 1)
4

2 に答える 2

3

Scalaは、2つの引数を使用しa + (b,c)てメソッドを呼び出そうとしていることを意味すると考えてます。これは、マップに複数の引数の加算メソッドがあるため、次のようなことができるため+、実際の可能性です。

m + (("a" -> 1), ("b" -> 2))

解決策は簡単です。括弧のセットを追加するだけで(b,c)、実際にはタプルが単一の引数として渡されていることが明確になります。

m + (("a", 1))
于 2013-03-24T19:42:07.277 に答える
2

実際、この理由は、Predef:http ://www.scala-lang.org/api/current/index.html#scala.Predef $ (Scalaでは常にスコープ内にあります)にAnyからへの暗黙の変換が含まれているためです。 ArrowAssoc(メソッドimplicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A]

ArrowAssocには、タプルに変換するメソッド->が含まれています。

つまり、基本的には、any2ArrowAssoc("a").->(1)どちらが返されるかを実行します( "a"、1)。

担当者から:

any2ArrowAssoc("a").->(1)
res1: (java.lang.String, Int) = (a,1)

さらに、次のような不変のハッシュマップで作業できます。

val x = HashMap[Int,String](1 -> "One")
x: scala.collection.immutable.HashMap[Int,String] = Map((1,One))
val y = x ++ HashMap[Int,String](2 -> "Two")
y: scala.collection.immutable.Map[Int,String] = Map((1,One), (2,Two))
val z = x + (3 -> "Three")
z: scala.collection.immutable.HashMap[Int,String] = Map((1,One), (3,Three))
于 2013-03-24T20:12:04.723 に答える