【发布时间】:2013-01-03 23:44:39
【问题描述】:
我有一个函数:
def nanoTime() = {
println("Getting nano time...")
System.nanoTime // returns nanoTime
}
还有另一个函数,它接受一个函数
def printTime(time: => Long) = { // indicates a by-name parameter
println(">> delayed()")
println("Param: " + time)
time // returns time
}
现在是这样。当我这样做时:
scala> printTime(nanoTime())
>> delayed()
Getting nano time...
Param: 546632085606127
Getting nano time...
res11: Long = 546632086131624
当我这样做时,我得到了相同的结果:
scala> printTime(nanoTime)
>> delayed()
Getting nano time...
Param: 546622367510997
Getting nano time...
res10: Long = 546622368149903
两者之间没有区别:
scala> printTime(nanoTime())
和
scala> printTime(nanoTime)
所以传递函数名和传递函数名后跟()是没有区别的。是不是一直都是这样,还是这个case有什么特别之处?
谢谢。
【问题讨论】:
-
不确定是否完全重复,但这个问题很接近:stackoverflow.com/questions/6939908/…
-
我不认为它是重复的,尽管它是相关的。此问题明确关注按名称参数,因此应在答案中明确说明此类等效(或缺少)。
-
(虽然我确信这其中有很多漏洞,但我通常将按名称调用视为创建匿名函数内部传递的参数的隐式包装。如果这样一个简单的视图是当
x等同于x()时,{() => x}和{() => x()}可以被视为等效代理。) -
@pst:这是不可取的。可以像匿名的零参数函数一样实现按名称参数,但它们非常不同。特别是,您无法获得代表按名称实际参数的“函数”。 所有您可以做的是评估实际参数表达式(任意多次),而不是像零参数函数那样通过添加
()后缀来完成。跨度>
标签: scala callbyname