您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: