我正在尝试阅读以下两个函数的参数列表:
1. def foo(action: => String => String) = "bar"
2. def foo(action: => () => String => String) = "bar"
答案 0 :(得分:13)
action
是一个按姓名传递的函数,它使用String
并返回String
。action
是一个名为pass-by-name的函数,它不会返回一个带String
并返回String
现在你可能会问,“嗯,参数是按姓名传递的意思是什么?”好吧......那是一整套不同的蠕虫。基本上,传递名称参数仅在函数中使用时评估,并且在函数中使用的每个时间。这允许的是短路,如下所示
def orOperator(left: Boolean, right: => Boolean) : Boolean = if (left) true else right
在这种情况下,如果发现right
为真,则运营商将短路(并在没有计算/评估left
的情况下终止)。
所以......你对这些参数的看法是类似的。它们是由于某种原因不进行评估的函数 - 除非/直到它们在函数体中命名。我不明白其动机,但......就是这样。我希望有所帮助。