当前位置: 首页 > 知识库问答 >
问题:

为什么隐式def需要implicitConversions的导入,而隐式val不需要?

白学
2023-03-14

我正在阅读本教程,它的底部写道:

由于如果不加选择地使用隐式转换,隐式转换可能会产生陷阱,因此编译器会在编译隐式转换定义时发出警告。要关闭警告,请执行以下任一操作:将 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

共有1个答案

甘学潞
2023-03-14

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

 类似资料:
  • 例如,我有这样的类,而不是在方法中指定字段,我只想隐式地打开选项。 我理解这样做的原因是,当我声明它们时,它们的初始值为,因此我不需要,因为所有类的字段都有初始值。我所需要做的就是确保在尝试访问它们之前为它们分配了一些内容,否则会出现致命错误。 假设我们给这些字段赋值,现在我们用某种方法,我想问的是:为什么我们需要在一个条件函数中使用bool来强制展开它?我可以访问其他隐式展开的选项,甚至是boo

  • 在PEP 8中--Python代码风格指南 明确的相对进口是绝对进口的一种可接受的替代方案 有人能详细解释一下吗?

  • 我和同事一起创建了一个Angular 5应用程序。我为我的所有界面创建了一个文件夹,并按功能进行分组。然而,我没有在它们上包含任何导出符号,并且在使用它们时,我从不需要导入它们……它们只存在,不会产生任何编译错误。我喜欢这种方式,因为它使代码更干净,但我只是在利用一些bug吗?我的同事以“正确”的方式完成了它,并且需要在任何时候导入他想要使用的界面。有什么想法吗?您应该如何创建存在于单独文件中的接

  • 问题内容: 我正在用查询执行ajax请求,想知道为什么我的响应已经是JS对象。 如果我做一个 ‘obj’为null,但是我可以将’response’用作js对象数组。 这不是真正的问题,但是我想了解这种行为。 谢谢 问题答案: 当您进行AJAX调用并指定dataType JSON时,就会发生这种情况jQuery会在响应中为您调用jQuery.parseJSON。实际上,您可以根据数据类型指定要调用

  • 我上了Java的课程,正在努力自学C和K 在Java中,您可以声明一个类似于公共静态浮点转换(int f)的函数,而不需要原型。这对我来说似乎简单得多。为什么会有差异?

  • 以下代码在C++11中编译成功: 它包括用于现代C++的JSON。一个工作示例在这个Wandbox中。 JSON变量被隐式转换为字符串。但是,如果我取消最后一行的注释,这是一个显式转换,它将无法编译。这里的编译结果。 除了这个json库的特殊细微差别之外,如何编写一个类,使隐式转换工作,而显式转换不工作? 是否有某种构造函数限定符允许这种行为?