这是我的测试代码:
object ImplicitTest {
import JoesPrefs._
Greeter.greet("Joe") // could not find implicit value for parameter prompt:
}
class PreferredPrompt(val preference: String)
object JoesPrefs {
implicit val prompt = new PreferredPrompt("Yes, master> ")
}
object Greeter {
def greet(name: String)(implicit prompt: PreferredPrompt) = {
println("Welcome, " + name + ". The system is ready.")
println(prompt.preference)
}
}
我使用scala 2.11.12,不知道为什么这个隐式不起作用,直到向val:添加类型注释
object JoesPrefs {
implicit val prompt: PreferredPrompt = new PreferredPrompt("Yes, master> ")
}
因此,确切的内部有点疯狂,但基本上可以归结为代码的编译顺序。当您添加类型注释时,val是";编译并放入范围";早于不这样做的时候,它就可以在ImplicitTest中解决。
有趣的是(至少对我来说^^(,你也可以将ImplicitTest移动到JoesPref对象之后的一行代码上(或将其移动到自己的文件中(,它将在没有类型注释的情况下编译。