2011-12-28 46 views
14

我想读的以下2个功能参数列表:如何阅读斯卡拉功能的链参数

1. def foo(action: => String => String) = "bar" 
2. def foo(action: =>() => String => String) = "bar" 
  1. 名为“foo”接收命名函数的函数“行动”哪个接收/返回?
  2. 一个名为“foo”的函数接收一个名为“action”的函数,该函数返回一个返回???的函数。
+0

我的理解问题是,我不知道如何决定是否在这里处理函数或简单的值作为参数。 – recalcitrant 2011-12-28 23:43:49

回答

13
  1. action是通过按姓名功能,需要一个String并返回一个String
  2. action是通过按姓名函数,它没有返回一个函数,它接受一个String,并返回一个String

现在你可能会问,“嗯,这是什么意思一个参数是通过按姓名?”好的...这是一个完全不同的蠕虫罐。基本上,只有在函数中使用了函数使用了时,才会评估传递的名称参数。是什么这允许像短路,如下

def orOperator(left: Boolean, right: => Boolean) : Boolean = if (left) true else right 

在这种情况下,运营商将短路(及终止,而无需计算/评估right)如果发现left是真实的。

所以......你对这些参数有什么相似之处。它们是不会评估的函数 - 出于某种原因 - 除非/直到它们在函数体中被命名。我不明白这个动机,但是......就是这样。我希望有所帮助。