次のコードの意図した出力は、数字0
.
object Bad extends App {
implicit val massTable: Map[String, Int] =
Map("H" -> 1, "He" -> 4, "O" -> 16)
Implementation.doWork()
}
object Implementation {
def doWork()(implicit massTable: Map[String, Int]) = println("0".toInt)
}
実際の出力は例外です。
java.util.NoSuchElementException: key not found: 0
at scala.collection.immutable.Map$Map3.apply(Map.scala:156)
at Implementation$.doWork(Main.scala:20)
at Bad$.delayedEndpoint$Bad$1(Main.scala:16)
...
調査の結果、 、 、 に提供された暗黙的なパラメーターが、 からの暗黙的な変換として意図せずに機能するようにするMap
実装が示されています。apply(string): Int
doWork
massTable
String => Int
その結果、上記の呼び出しは、によって提供されるメソッドではなく、タイプtoInt
の合成メソッドになります。toInt
Int
toInt
StringOps
この種の問題を回避し、目的の出力を達成するための最良の方法は何ですか?