3

Scala v2.9.2 (および 2.8.0) では、このスクリプトは次のようになります。

case class MyString(s: String)
implicit def stringToMyString(s: String) = MyString(s)
implicit val defaults: Map[String, MyString] = Map("abc" -> MyString("123"))

case class HasDefaults(name: String = "none", 
    baseMap: Map[String, MyString] = Map.empty) {
  def add(kvp: (String, MyString)*)(implicit defaults: Map[String, MyString]) =
    this.copy(baseMap = this.baseMap ++ defaults ++ kvp)
}

val hasDefaults = HasDefaults() add (
  "def" -> "124",
  "xyz" -> MyString("999")
)

println(hasDefaults)

次の場合に失敗します。

java.util.NoSuchElementException: key not found: 124
    at scala.collection.MapLike$class.default(MapLike.scala:224)
    at scala.collection.immutable.Map$Map1.default(Map.scala:106)
    at scala.collection.MapLike$class.apply(MapLike.scala:135)
    at scala.collection.immutable.Map$Map1.apply(Map.scala:106)
    at Main$$anon$1.<init>(HasDefaults.scala:12)

文字列値が値として定義されていても (演算子"124"の右側にあるため)、マップ ルックアップのキーとして文字列値を使用しようとしています。->

MyStringへの暗黙的な変換が試行されない場合、このエラーはなくなることに注意してください。例えば:

val hasDefaults = HasDefaults().add(
  "def" -> MyString("124"),
  "xyz" -> MyString("999")
)

#2に注意してください。暗黙のパラメーターが明示的に指定されている場合、エラーもなくなります。例えば:

val hasDefaults = HasDefaults().add(
  "def" -> "124",
  "xyz" -> MyString("999")
)(Map("abc" -> MyString("123")))
4

1 に答える 1

6

Scalaでは、Mapは関数です。(Map[A, B] <: PartialFunction[A, B] <: A => B。)したがって、からへdefaultsの暗黙の変換のように機能します。が含まれていないため、「キーが見つかりません」というエラーが発生します。StringMyStringdefaults"124"

于 2012-06-22T06:29:12.090 に答える