scala by-name parameter

谷越
2023-12-01

举个例子(是参考《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,更加安全

 类似资料:

相关阅读

相关文章

相关问答