假设我有这样的方法定义:
def strangeMethod[A](value: => A): A = value;
我用它,例如那样:
strangeMethod(() => "foo");
对我来说,预期的行为是返回一个String对象。而是返回:
() => String = <function0>
为什么?
如果我尝试这样的话:
def strangeMethod[A](value: => A): A = value();
我当然得到编译时错误。
我很困惑......
PS 我知道我可以这样定义:
def strangeMethod[A](value: () => A): A = value();
行为将如预期,但为什么第一个例子不能正常工作?
答案 0 :(得分:3)
在def strangeMethod[A](value: => A): A = value
中,value: => A
是一个评估为A
的块,按名称传递 - 每次检索其值时,它都将是再次评估。例如:
def strangeMethod2[A](block: => A): A = {block; block}
strangeMethod2({
val hi = "hi "
println("middle")
val dad = "dad"
hi ++ dad
})
在控制台中给出:
middle
middle
res0: String = hi dad
但() => "foo"
是从Unit
到String
(带有0个参数的函数,function0)的函数,因此当您将其传递给strangeMethod
时它将返回相同的功能 - 您可以调用它:
scala> strangeMethod(() => "foo")()
res1: String = foo