【发布时间】:2017-06-27 04:44:13
【问题描述】:
我正在阅读这个tutorial,并在底部声明
因为如果不加选择地使用隐式转换可能会有陷阱,编译器会在编译隐式转换定义时发出警告。要关闭警告,请执行以下任一操作:将 scala.language.implicitConversions 导入隐式转换定义的范围...
如果您使用隐式 val 而不是隐式 def,则不会引发警告。这是为什么呢?
换句话说,如果我执行以下操作,则不需要导入:
implicit val int2str = (i: Int) => i.toString
但如果我执行以下操作,我确实需要导入:
implicit def int2str(i: Int) = i.toString
-----更新----- 这是一个玩具示例,它表明隐式 val 有效:
case class CoolString(coolString: String)
class RichCoolString(rich: CoolString) {
val hasCat: Boolean = rich.coolString.contains("cat")
}
object RichCoolString {
implicit val coolStringToRichCoolString = (coolString: CoolString) => new
RichCoolString(coolString)
}
scala> import RichCoolString._
import RichCoolString._
scala> CoolString("cool cats").hasCat
res0: Boolean = true
【问题讨论】:
-
隐式转换是将
implicit“自动”应用于一个值,这可能会产生误导。 Typeclass 是基于 0..n 个类型的隐式类型。
标签: scala