说,首先,我有这个功能:
def number5()={
println("number 5 starting")
println("number 5 exiting")
5
}
接着:
def giveMeCallByNameParameter(f: =>Int)={
println("starting")
f
println("exiting")
}
当我称呼它时:
giveMeCallByNameParameter(number5)
我得到这个结果:
starting
number 5 starting
number 5 exiting
exiting
如果我也有此功能:
def giveMeAnotherFunction(f: ()=>Int)={
println("starting")
f()
println("exiting")
}
我称之为:
giveMeAnotherFunction(number5)
我得到相同的结果:
starting
number 5 starting
number 5 exiting
exiting
那么,它们有什么不同吗?除了是否有括号的区别?
如果他们没有不同?那为什么我们要用名称来称呼这个术语呢?
别名参数可以是任何有效的表达式。函数也是有效的表达式,但只是一种表达式。
别名参数和按值参数之间的最大区别在于,按值参数(最常见的一种函数参数)在传递到函数之前先进行求值。至少在传递给函数之后,按名称参数的评估才延迟。函数本身不一定会评估参数,也不一定会评估参数。
碰巧的是,函数具有相同的属性,但是正如我之前所说,函数只是一种表达式,而按名称的参数可以采用任何一种有效的表达式。
别名参数的一个很好的用例是构建自定义的断言函数:
def byNameAssert(predicate: => Boolean) =
if (assertionsEnabled && !predicate)
throw new AssertionError
这样,您可以通过控制assertionsEnabled
值来关闭对断言条件的评估。
如果未启用断言,则您甚至可以拥有一个表达式,该表达式通常会抛出而不产生异常:
byNameAssert(x / 0 == 0)
还要注意,表达式x / 0 == 0
不是函数!按名称的参数可以采用任何形式的表达式,但是至少在调用该函数之后才将其求值时间延长。
希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句