按名称传递参数

Posted 为尊严而奋斗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按名称传递参数相关的知识,希望对你有一定的参考价值。

通常情况下,函数的参数是传值参数;即参数的值在它被传递给函数之前被确定。但是,如果我们需要编写一个接收参数不希望马上计算,直到调用函数内的表达式才进行真正的计算的函数。对于这种情况,Scala提供按名称参数调用函数。

示例代码如下:

技术分享

 

结果:

技术分享

 

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

 

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

 

如果将t: => Long改成t: Long,则按照值传递进行计算,结果如下:

技术分享

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

 

另一个示例代码如下:

技术分享

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

 

如果将msg: =>String改为msg: String,则执行代码就会报错

技术分享

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

 

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






以上是关于按名称传递参数的主要内容,如果未能解决你的问题,请参考以下文章

[Scala函数特性系列]——按名称传递参数

[Scala函数特性系列]——按名称传递参数

特定的参数传递样式:按值调用、按名称调用等

按名称重复参数

VB 参数传递:按值传递和按地址传递

java学习笔记:java的方法参数传递