我花了一个上午的时间阅读 Scala 作用域是如何隐含的,包括这里非常出色的答案:Where does Scala look for implicits?

但是,唉,我还是一头雾水。让我举一个我正在尝试做的例子:

object Widget {
  implicit val xyz: Widget = new Widget("xyz")
}
class Widget(val name: String) {
  override def toString = name
}
class Example {
  def foo(s: String)(implicit w: Widget): Unit = {
    println(s"Got $s with $w")
  }
  def bar {
    foo("abc")  // Compiler error at this line
  }
}

object implicit_test {
  val x = new Example()
  x.bar
}

所以,我希望看到类似 Got abc with xyz 的东西。相反,我被告知 could not find implicit value for parameter w: Widget 。现在,奇怪的是,如果我在 Widget 对象中移动 Example 类和对象以及 implicit_test 类,那么这会起作用。

请再次向我解释,如果你愿意,Scala 究竟是如何识别使用哪个隐式 val 的!

最佳答案

您的代码应该可以工作,并且对我有用。

你是偶然在 REPL 中输入的吗?如果是这样,那么伴生对象就有些特殊了。在scala中,伴生对象必须与其类在同一个文件中(否则,代码是有效的,但它不是“伴生对象”,只是一个同名的对象,而不是隐式作用域的一部分)。在 REPL 中,没有文件,但必须同时定义类及其伴生对象。为此,您必须以粘贴模式输入它们。

输入 :paste ,然后至少粘贴(或仅输入)对象 Widget 和类 Widget (您可以同时将其余部分粘贴到代码中,但不是必需的),然后是 CTRL-D 。那应该工作。

关于Scala 隐式参数范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27585072/

10-11 22:40
查看更多