Scala中 => Unit 与 () =>Unit的区别
() => Unit ---> 是一个函数;=> Unit --> 是一个执行结果为Unit的表达式
code: => Unit是 by name 传递参数。参数是一个返回值为Unit的代码块。在传递的时候,参数没有被调用。比如:
def test(code : => Unit){
println("start")
code // 这行才会调用传入的代码块,写成code()亦可
println("end")
}
test{// 此处的代码块不会马上被调用
println("when evaluated")
println("bb")
}
结果
start
when evaluated
bb
end
注意:when evaluated被打印在了start和end中间。
而code: ()=>Unit参数的类型,是一个没有参数而且返回值为Unit的函数类型。
def test1(code: ()=>Unit){
println("start")
code() // 要想调用传入的代码块,必须写成code(),否则不会调用。
println("end")
}
test1 {//此代码块,传入后立即执行。
println("when evaluated")
()=>{println("bb")}
}
结果:
when evaluated
start
bb
end
注意:when evaluated被打印在了start之前。
实际上,在第二例当中,test1的参数是一个表达式。在Scala中,如果将要传入的参数正好是一个,则可以用花括号。这时候test1的参数列表是一个表达式,而这个表达式的结果是最后一行的返回,也就是一个函数() => { println("bb") },它被传给了test1的唯一参数。然后test1方法体执行。至于为什么when evaluated在另外三行之前,是因为它是在传参的时候,求表达式值的副产物。
其实code :=> Unit就是code : () => Unit,只是第一种是按名传参,用花括号可以把花括号内的所有东西作为一个函数传给code;第二种就是普通传参,但是它刚好只有一个参数。这时候用了花括号,就是花括号内表达式的值传进去了。
最后,提供对等用例
object FunctionTest2 {
def main(args: Array[String]) {
def test(code: => Unit) {
println("start")
code
println("end")
}
test {
println("when evaluated")
println("bb")
}
def test1(code: () => Unit) {
println("start")
code()
println("end")
}
test1 {
() =>
println("when evaluated")
println("bb")
}
}
}
Scala中 => Unit 与 () =>Unit的区别的更多相关文章
- Scala中 object 和 class的区别
object 在scala中没有静态方法和静态字段,所以在scala中可以用object来实现这些功能,直接用对象名调用的方法都是采用这种实现方式,例如Array.toString.对象的构造器在第一 ...
- Scala 中object和class的区别
Scala中没有静态类型,但是有有“伴侣对象”,起到类似的作用. Scala中类对象中不可有静态变量和静态方法,但是提供了“伴侣对象”的功能:在和类的同一个文件中定义同名的Object对象:(须在同一 ...
- Scala中==,eq与equals的区别
根据官方API的定义: final def ==(arg0: Any): Boolean The expression x == that is equivalent to if (x eq null ...
- Scala中class和object的区别
1.class scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C ...
- 【Todo】【转载】Scala中Array, List, Tuple的区别
参考了这篇文章: https://my.oschina.net/u/1034176/blog/512314 1. 在Scala 2.7中,Array.List都不能混合类型,只有Tuple可以:而在S ...
- scala中val和var的区别
1:内容是否可变:val修饰的是不可变的,var修饰是可变的 2:val修饰的变量在编译后类似于java中的中的变量被final修饰 3:lazy修饰符可以修饰变量,但是这个变量必须是val修饰的 p ...
- Scala中None, Nil, Nothing的区别
Nil是一个空的List None是一个object,是Option的子类型 List[Nothing]
- scala中nothing和null的区别
1:nothing是所有类型的子类,他没有具体的实例对象,常见的应用:抛出异常.程序exit.无线循环等. 2:nothing是所有类型的子类,也是null的子类,nothing没有对象,但是可以用来 ...
- Scala中的isInstanceOf和asInstanceOf区别
判断对象是否属于某个给定的类,可以用isInstanceOf方法:用asInstanceOf方法将引用转换为子类的引用. obj.isInstanceOf[T]就如同Java的obj instance ...
随机推荐
- python的数据结构之栈
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构. 由于栈具有后入先出的特点,所以任何不在栈顶的元素 ...
- I - Cows
来源 poj 3348 Your friend to the south is interested in building fences and turning plowshares into sw ...
- mapper.xml
#{}如果是字符串就不用加引号,否则报错,${}也一样,不是占位符需要加
- DB2 的代理 (agent)
DB2 的代理 (agent) 是位于 DB2 服务器中的服务于应用程序请求的一些进程或线程.当有外部应用程序连接至 DB2 实例提出访问请求时,DB2 的代理就会被激活去应答这些请求.一般 DB2 ...
- VMWARE虚拟机不显示主机共享的文件夹解决办法
执行如下命令重新配置,不用重启. #sudo vmware-config-tools.pl
- [No000018E]Vim快速跳转任意行、任意列以及高亮显示当前行、当前列方法-Vim使用技巧(3)
vim提供了丰富的快速跳转任意行.任意列的方法,方便高效地移动光标,定位文件位置. 一.Vim行跳转 使用vim查看文件时,使用以下命令可以快速跳转文件首.尾行,方便对整个文件有个全局把握. 1.1 ...
- java获取文件的路径问题
java获取文件的路径问题 在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法. 本基于springboot做的测试,主要是构建工程方便,所用的方法都是JDK中的方 ...
- 1.7Oob 继承关系中构造方法的使用
1:父类中最好要有一个空参数的构造方法,因为默认的构造方法在自定义了构造方法后就不存在了,需要显示的写出来. 若父类中没有空参数的构造方法,则子类必须有自定义的构造方法,且用super()调用父类的构 ...
- Redis环境配置和命令语句
环境配置 拷贝Redis-x64-3.2.100到本地一个目录下,解压 然后设置环境变量PATH到该目录 Redis-server.exe:Redis服务端 Redis-cli.exe:Redis客户 ...
- 指数级计算复杂度 调用Fibonacci函数次数
指数级计算复杂度 计算调用次数 #include <stdio.h> long fibonacciCallTimes(long n); int main(void) { long resu ...