Scala隐式参数范围

时间:2014-12-20 22:50:11

标签: scala compiler-errors

我整个上午都在阅读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类和对象以及<{1}}对象内的Example,那么这就行了。

请再次向我解释一下,如果你愿意,Scala如何确定使用哪个隐式值!

1 个答案:

答案 0 :(得分:4)

您的代码应该可以运行,它确实对我有用。

您是否偶然在REPL中输入了?如果是这样,伴侣对象有一些特殊之处。在scala中,伴随对象必须与其类在同一文件中(否则,代码有效,但它不是&#34;伴随对象&#34;,只是具有相同名称的对象,而不是隐含的范围)。在REPL中,没有文件,但必须同时定义类及其伴随对象。为此,您必须以粘贴模式输入它们。

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