Scala 按名称参数调用函数 与 =>的用法

转自:http://blog.csdn.net/shenxiaoming77/article/details/54835679函数

一般状况下,函数的参数是传值参数;即参数的值在它被传递给函数以前被肯定。可是,若是咱们须要编写一个接收参数不但愿立刻计算,直到调用函数内的表达式才进行真正的计算的函数。对于这种状况,Scala提供按名称参数调用函数。spa

示例代码以下:.net

 

结果:blog

 

在代码中,若是定义函数的时候,传入参数不是传入的值,而是传入的参数名称(如代码中使用t: => Long而不是t: Long),在调用该函数时,不会当即执行和参数有关的计算,而是到参数真正使用到的时候才进行计算。get

 

结果说明:主函数调用delayed函数后,并不当即执行参数(time()函数的结果),而是跳过,直接执行delayed函数的第一行,到第二行真正使用到t时,才执行time()函数获取t的值,故有上述结果。im

 

若是将t: => Long改为t: Long,则按照值传递进行计算,结果以下:异常

此时主函数调用了delayed函数后就直接先执行time()函数获取t的值margin

 

另外一个示例代码以下:top

这里调用了一个log函数,传入的参数中有1/0,按理说应该会报异常,但实际结果倒是代码顺利的执行完成。为何呢?这是由于咱们在定义log函数的时候使用了“按名称传递参数”,只有到实际执行参数相关的计算时才会检查是否有异常。而代码中if(logEnable) println(msg)这一行代码实际根本就不会执行,天然也就不会存在检查异常的问题了img

 

若是将msg: =>String改成msg: String,则执行代码就会报错

由于在执行到log(MSG +1 / 0)这一句时就直接计算了1/0,天然就会报错了

 使用“按名称传递参数”方式的优势是:1.减小没必要要的计算; 2.减小异常

相关文章
相关标签/搜索