Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么隐式定义需要导入隐式转换,而隐式val不';T_Scala - Fatal编程技术网

Scala 为什么隐式定义需要导入隐式转换,而隐式val不';T

Scala 为什么隐式定义需要导入隐式转换,而隐式val不';T,scala,Scala,我正在读这篇文章,它的底部写着 因为如果不加区分地使用隐式转换,则编译器在编译隐式转换定义时会发出警告。要关闭警告,请执行以下操作之一:将scala.language.implicitConversions导入隐式转换定义的范围 如果使用隐式val而不是隐式def,则不会引发警告。为什么呢 换句话说,如果我执行以下操作,我不需要导入: implicit val int2str = (i: Int) => i.toString implicit def int2str(i: Int) =

我正在读这篇文章,它的底部写着

因为如果不加区分地使用隐式转换,则编译器在编译隐式转换定义时会发出警告。要关闭警告,请执行以下操作之一:将scala.language.implicitConversions导入隐式转换定义的范围

如果使用隐式val而不是隐式def,则不会引发警告。为什么呢

换句话说,如果我执行以下操作,我不需要导入:

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,因为它们直接读取更容易