隐式参数需要类型注解才能编译
Implicit parameter need Type annotation to compile
这是我的测试代码:
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 对象之后的一行代码中(或将其移动到它自己的文件中),它将在没有类型注释的情况下进行编译。
这是我的测试代码:
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 对象之后的一行代码中(或将其移动到它自己的文件中),它将在没有类型注释的情况下进行编译。