首先解释下call by name 的作用:
all by name : 为了避免在调用时用() => 符号,以为这有点丑陋: Omit the (), but not the
=> in the parameter declaration
比如没有call by name
def runInThread(block: () => Unit) {
new Thread {
override def run() { block() }
}.start()
}
这样调用的时候是这样的 runInThread { () => println("Hi"); Thread.sleep(10000); println("Bye") } 必须要有() =>,丑陋
应用call by name,就可以这样声明函数的参数
def runInThread(block: => Unit) {
new Thread {
override def run() { block }
}.start()
}
调用的时候就变的简单优雅: runInThread { println("Hi"); Thread.sleep(10000); println("Bye") }
两者之间的比较:
Call by name :传给函数/方法M的参数是另外一个参数函数,该参数函数在函数体内调用时执行
call by value : 传给函数的参数是个值,如果是个表达式或者是另外一个参数函数,则要先计算出表达式的值或者是要先得到参数函数执行后的返回值
《Programming in Scala, 2nd Edition》在 9.5 By-name parameters 一节出给出一个例子解释
代码如下:
object bynameparameters extends App {
var assertionsEnabled = false
//Call by name
def byNameAssert(predicate: => Boolean) =
if (assertionsEnabled && !predicate)
throw new AssertionError
//call by value
def boolAssert(predicate: Boolean) =
if (assertionsEnabled && !predicate)
throw new AssertionError
//boolAssert(3 /0 == 0) // java.lang.ArithmeticException: / by zero
byNameAssert(3 / 0 == 0) //will not yield an exception:
}
当执行boolAssert(3 /0 == 0) 时,会先算3 /0 == 0表达式,于是抛出异常
但是执行byNameAssert(3 / 0 == 0),3 / 0 == 0,会隐式转换成一个函数predicate给byNameAssert,因为assertionsEnabled = false,所以在if语句判断中永远不会执行predicate方法,所以不会产生异常
另外在stackoverflowe 上有篇关于“call by name“和 “call by value”的解释不错,可以参考
相关推荐
scala库 by maven依赖
面向Java开发人员Scala指南,Scala和servlet的比较 以及一些网上资料的整理,给大家分享分享!!!
A lot of example code to demonstrate Scala programming language, by the inventor of the language.
Scala以及kafka的安装包,Linux下的安装包,Scala2.11.4和kafka的2.92
using(petsDB) { connection => val findHogsQuery = "select name, gender from pets where family='erinaceidae' order by cuteness" val listOfHedgehogs = connection.inferListOf[Hedgehog](findHogsQuery) { ...
scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...
scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3
Scala和Spark大数据分析函数式编程、数据流和机器学习
scala erlang groovy python 原理 比较 分析
scala by example, learn scala by example
scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...
scala2.12.1Windows镜像包
Scala数据结构和算法
Scala by example by martin odersky draft 2011
scala3 scala3 scala3 scala3 scala3
scala:Scala和设计模式 疯狂代码 http://CrazyCoder.cn/ ĵ:http:/CrazyCoder.cn/Java/Article42687.html 在当前软件Software设计中最流行要算GoF这本书中提出各种设计模式很多人认为设计模式对于语言(特 别是c/Java...
“本书向你展示了提升Scala技能的方法和理念,它已超过‘更好的Java’。” ——Fernando Dobladez, Code54 “里面的练习有些挑战,很有趣,对你在真实世界中使用它很有益。” ——Chris Nauroth, ...
scala netbeans 插件(1)scala netbeans 插件(1)
此文档是讲解实战Scala,...本书面向实际的使用场景,提供了大量的Scala实例,同时,也给出底层的原理和相关的参考。对于Scala新手来说这是一本不错的入门书,对于老手来说也是一本夯实基础,检视自己所学知识的好书。