以下代码的预期输出是数字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
方法
避免此类问题并获得所需输出的最佳方法是什么?