Scala 为什么隐式定义需要导入隐式转换,而隐式val不';T
我正在读这篇文章,它的底部写着 因为如果不加区分地使用隐式转换,则编译器在编译隐式转换定义时会发出警告。要关闭警告,请执行以下操作之一:将scala.language.implicitConversions导入隐式转换定义的范围 如果使用隐式val而不是隐式def,则不会引发警告。为什么呢 换句话说,如果我执行以下操作,我不需要导入:Scala 为什么隐式定义需要导入隐式转换,而隐式val不';T,scala,Scala,我正在读这篇文章,它的底部写着 因为如果不加区分地使用隐式转换,则编译器在编译隐式转换定义时会发出警告。要关闭警告,请执行以下操作之一:将scala.language.implicitConversions导入隐式转换定义的范围 如果使用隐式val而不是隐式def,则不会引发警告。为什么呢 换句话说,如果我执行以下操作,我不需要导入: implicit val int2str = (i: Int) => i.toString implicit def int2str(i: Int) =
implicit val int2str = (i: Int) => i.toString
implicit def int2str(i: Int) = i.toString
但如果我执行以下操作,我确实需要导入:
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
这很可能是一个bug,应该对这两种情况都有警告。至少我在规范中找不到异常。创建的隐式转换是一个应用于值的隐式“自动”转换,这可能会产生误导。Typeclass是一个基于0..n个类型的隐式类。是的,这里甚至定义了
val
也应该产生一个警告:(第4页隐式转换)非常感谢!我一直选择使用val方法,因为它为我保存了一个导入,但现在,知道这是一个bug,我将恢复使用defs,因为它们直接读取更容易