【问题标题】:Why does implicit def require an import of implicitConversions but implicit val doesn't?为什么隐式 def 需要导入 implicitConversions 而隐式 val 不需要?
【发布时间】: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


【解决方案1】:

这很可能是一个错误,这两种情况都应该有警告。至少我在规范中找不到异常。创建https://github.com/scala/bug/issues/10392

【讨论】:

  • 是的,它甚至在这里定义,val 也应该产生警告:docs.scala-lang.org/sips/completed/…(第 4 页implicitConversion)
  • 非常感谢!我一直选择使用 val 方法,因为它为我节省了导入,但现在,知道这是一个错误,我将恢复使用 defs,因为它们直接阅读起来更容易
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多