SCALA随笔(一)
2015-10-29 16:45
369 查看
传名参数=>和零参数函数()=>
scala代码
object FunctionTest2 extends App {
def test(code: => Unit) {
println("start")
code // 这行才会调用传入的代码块,写成code()亦可
println("end")
}
test { // 此处的代码块不会马上被调用
println("when evaluated")
println("bb")
}
def test1(code: () => Unit) {
println("start")
code() // 要想调用传入的代码块,必须写成code(),否则不会调用。
println("end")
}
test1 { //此代码块,传入后立即执行。
println("when evaluated")
() => { println("bb") }
}
}
看看反编译的东西:
Java代码
public void test(Function0<BoxedUnit> code)
{
Predef..MODULE$.println("start");
code.apply$mcV$sp();
Predef..MODULE$.println("end");
}
public void test1(Function0<BoxedUnit> code)
{
Predef..MODULE$.println("start");
code.apply$mcV$sp();
Predef..MODULE$.println("end");
}
两个都是编译成Function0,但是看看下面主函数的反编译,test1的的when evaluated被编译到次处,然后才调用test1
Java代码
public final Object apply()
{
this.$outer.test(new FunctionTest2..anonfun.1());
Predef..MODULE$.println("when evaluated");
this.$outer.test1(
new FunctionTest2..anonfun.2());
return BoxedUnit.UNIT;
}
下面是test{}块反编译:
Java代码
public final class FunctionTest2$$anonfun$1 extends AbstractFunction0.mcV.sp
implements Serializable
{
public static final long serialVersionUID = 0L;
public final void apply()
{
apply$mcV$sp(); }
public void apply$mcV$sp() { Predef..MODULE$.println("when evaluated");
Predef..MODULE$.println("bb");
}
}
下面是test1{}块反编译:
Java代码
public final class FunctionTest2$$anonfun$2 extends AbstractFunction0.mcV.sp
implements Serializable
{
public static final long serialVersionUID = 0L;
public final void apply()
{
apply$mcV$sp(); }
public void apply$mcV$sp() { Predef..MODULE$.println("bb");
}
}
这里说明了传名参数=>和零参数函数()=>的区别了,后者是参数函数先计算运行了返回()=>实例在传给test1的,porgarmming in scala专门有一章节讲述byName Paramter
scala代码
object FunctionTest2 extends App {
def test(code: => Unit) {
println("start")
code // 这行才会调用传入的代码块,写成code()亦可
println("end")
}
test { // 此处的代码块不会马上被调用
println("when evaluated")
println("bb")
}
def test1(code: () => Unit) {
println("start")
code() // 要想调用传入的代码块,必须写成code(),否则不会调用。
println("end")
}
test1 { //此代码块,传入后立即执行。
println("when evaluated")
() => { println("bb") }
}
}
看看反编译的东西:
Java代码
public void test(Function0<BoxedUnit> code)
{
Predef..MODULE$.println("start");
code.apply$mcV$sp();
Predef..MODULE$.println("end");
}
public void test1(Function0<BoxedUnit> code)
{
Predef..MODULE$.println("start");
code.apply$mcV$sp();
Predef..MODULE$.println("end");
}
两个都是编译成Function0,但是看看下面主函数的反编译,test1的的when evaluated被编译到次处,然后才调用test1
Java代码
public final Object apply()
{
this.$outer.test(new FunctionTest2..anonfun.1());
Predef..MODULE$.println("when evaluated");
this.$outer.test1(
new FunctionTest2..anonfun.2());
return BoxedUnit.UNIT;
}
下面是test{}块反编译:
Java代码
public final class FunctionTest2$$anonfun$1 extends AbstractFunction0.mcV.sp
implements Serializable
{
public static final long serialVersionUID = 0L;
public final void apply()
{
apply$mcV$sp(); }
public void apply$mcV$sp() { Predef..MODULE$.println("when evaluated");
Predef..MODULE$.println("bb");
}
}
下面是test1{}块反编译:
Java代码
public final class FunctionTest2$$anonfun$2 extends AbstractFunction0.mcV.sp
implements Serializable
{
public static final long serialVersionUID = 0L;
public final void apply()
{
apply$mcV$sp(); }
public void apply$mcV$sp() { Predef..MODULE$.println("bb");
}
}
这里说明了传名参数=>和零参数函数()=>的区别了,后者是参数函数先计算运行了返回()=>实例在传给test1的,porgarmming in scala专门有一章节讲述byName Paramter
相关文章推荐
- WebService服务搭建
- 基础篇:1.JavaScript运行在html中,引用有几种方式?—— 6.js中常用的输出方式?
- ios开发系列-界面
- 从头认识java-6.1 聚合(aggregation)
- webpack安装配置使用教程详解
- jaudiotagger获取MP3文件信息及封面图片
- 转载:Linux查看设置系统时区
- [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
- Java-单例设计模式(基础)
- ibooks打开iframe引用的html文件乱码
- Android代码静态检查工具---android lint
- 线程常用函数 互斥 同步 ------笔记
- 极客学院-PHP002-PHP 开发环境搭建[4_36]
- android 中popupwindow 和类似360悬浮小球
- phonegap + Framework7 之 ios 推送跳转测试
- 一道题反映Java的类初始化过程
- json 数据 添加 删除 排序
- 信息学奥林匹克竞赛-统计单词数
- Linux 下bin格式软件的安装与卸载
- 文章标题