传名参数=>和零参数函数()=>
看看反编译的东西:
两个都是编译成Function0,但是看看下面主函数的反编译,test1的的when evaluated被编译到次处,然后才调用test1
下面是test{}块反编译:
下面是test1{}块反编译:
这里说明了传名参数=>和零参数函数()=>的区别了,后者是参数函数先计算运行了返回()=>实例在传给test1的,porgarmming in scala专门有一章节讲述byName Paramter
- 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") }
- }
- }
看看反编译的东西:
- 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
- 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{}块反编译:
- 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{}块反编译:
- 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