首先解释下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 Example》是一本全面介绍Scala编程的指南,覆盖了从基本语法到高级特性的方方面面,适合初学者和有经验的程序员深入学习。通过这本书,读者可以了解到Scala的优雅和强大,从而更好地利用它进行...
Scala库在软件开发中扮演着重要的角色,尤其是在大数据处理、机器学习和Web应用程序等领域。它是一种多范式编程语言,融合了面向对象和函数式编程的特性,为开发者提供了强大的工具集。Maven是Java生态中的一个项目...
- **Call By Value**:参数在调用时计算一次。 - **Call By Name**:参数在每次使用时计算。 - 示例:`def f(x: => Int) = println(x); f { println("Hello"); 1 }` - 在此示例中,`f` 函数接受一个名为 `x` 的...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,为Java开发者提供...通过阅读和实践本指南,Java开发者可以逐步了解Scala并比较其与Servlet的差异,以便于决定何时以及如何在项目中引入Scala。
Scala是一种强大的、面向对象的编程语言,它集成了函数式编程的特点,被广泛应用于大数据处理和分布式计算领域。Kafka是Apache基金会开发的一款开源流处理平台,它最初由LinkedIn设计并贡献,现在已经成为大数据生态...
Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...
Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态系统的资源。Scala-2.12.3是Scala的一个特定版本,它包含了对Java 8及更高版本的支持,并提供...
- **面向对象+函数式编程**:Scala融合了面向对象编程和函数式编程的特性,支持类、对象和继承的同时也支持高阶函数、不可变性等函数式编程的核心概念。 - **分布式运行**:Scala设计之初就考虑到了并行和分布式...
val tableName = TableName.valueOf("your_table_name") val table = connection.getTable(tableName) ``` 5. 插入数据: 创建一个`Put`对象来插入一行数据,并设置行键和列族: ```scala val put = new Put...
Scala和Spark是大数据分析领域中的两个重要工具,它们在处理大规模数据时表现出强大的性能和灵活性。Scala是一种静态类型的函数式编程语言,而Spark是一个分布式计算框架,尤其适合于大数据处理和分析。本教程将深入...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala2.12.1Windows镜像包"是为Windows操作系统设计的Scala编程环境的安装包,版本号为2.12.1。Scala 2.12.x系列是其重要的一个稳定...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面表现出色。"Scala实战高清讲解"这本书是学习Scala的宝贵资源,尤其对于那些希望深入理解并提升Scala技能的...
Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...
using(petsDB) { connection => val findHogsQuery = "select name, gender from pets where family='erinaceidae' order by cuteness" val listOfHedgehogs = connection.inferListOf[Hedgehog](findHogsQuery) { ...
Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala-2.12.10.zip"文件是Scala编程语言的特定版本——2.12.10,专为Windows操作系统设计的安装包。Scala 2.12.x系列是该语言的一个...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理领域,特别是与Apache Spark相结合时。本课件是针对Scala学习者精心准备的资源,旨在帮助你深入理解和掌握Scala的...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...
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 ...
1. **Java与Scala的互操作性**:Scala代码可以直接调用Java库,并且Scala和Java代码可以在同一个项目中混合编写。 2. **类型推断**:Scala允许程序员省略变量或方法的显式类型声明,编译器能够自动推断出正确的类型...