scala by-name parameter

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值