举个例子(是参考《scala编程》中的例子):
例如实现myAssert函数,myAssert的参数是一个函数值,该函数值返回Boolean
def myAssert(predict: () => Boolean) {
//()表示predict不带参数,Boolean表示predict返回Boolean
if (!predict()) {
//此处的predict后必须加一个(),因为myAssert的predict后有一个()
throw new AssertionError
}
}
在使用过程中:
myAssert(() => 3 < 2)
如果写成myAssert(3 < 2),编译报错。
需要做如下改动:
def myAssert(predict: => Boolean) {
//去掉了()
if (!predict) {
//去掉了()
throw new AssertionError
}
}
再次使用时,就可以myAssert(3 < 2)
如果再次对myAssert做些改动:
def myAssert(predict: Boolean) {
//此处的predict就不是一个函数值了,而是一个Boolean变量
if (!predict) {
throw new AssertionError
}
}
在使用过程中,也可以使用myAssert(3 < 2),看上去def myAssert1(predict: Boolean)和
def myAssert2(predict: => Boolean)是一样的
但是,myAssert(3 < 2)对于myAssert1,是先计算3<2的结果,再将Boolean结果传递到myAssert1中
对于myAssert2,3<2是作为函数值传递的,在执行语句if (!predict)是,创建一个函数,由该函数的apply方法计算3<2的结果
综上,还是推荐使用myAssert(predict: => Boolean),by-name parameter,更加安全