匿名按名称功能 - 执行

时间:2014-05-24 15:25:53

标签: scala

假设我有这样的方法定义:

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();

行为将如预期,但为什么第一个例子不能正常工作?

1 个答案:

答案 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"是从UnitString(带有0个参数的函数,function0)的函数,因此当您将其传递给strangeMethod时它将返回相同的功能 - 您可以调用它:

scala> strangeMethod(() => "foo")()
res1: String = foo