SCALA随笔(一)

传名参数=>和零参数函数()=>
scala代码   收藏代码
  1. object FunctionTest2 extends App {  
  2.   
  3.   def test(code: => Unit) {  
  4.     println("start")  
  5.     code // 这行才会调用传入的代码块,写成code()亦可    
  6.     println("end")  
  7.   }  
  8.   test { // 此处的代码块不会马上被调用    
  9.     println("when evaluated")  
  10.     println("bb")  
  11.   }  
  12.   
  13.   def test1(code: () => Unit) {  
  14.     println("start")  
  15.     code() // 要想调用传入的代码块,必须写成code(),否则不会调用。    
  16.     println("end")  
  17.   }  
  18.   test1 { //此代码块,传入后立即执行。    
  19.     println("when evaluated")  
  20.     () => { println("bb") }  
  21.   }  
  22. }  


看看反编译的东西: 
Java代码   收藏代码
  1. public void test(Function0<BoxedUnit> code)  
  2. {  
  3.   Predef..MODULE$.println("start");  
  4.   code.apply$mcV$sp();  
  5.   Predef..MODULE$.println("end");  
  6. }  
  7.   
  8. public void test1(Function0<BoxedUnit> code)  
  9. {  
  10.   Predef..MODULE$.println("start");  
  11.   code.apply$mcV$sp();  
  12.   Predef..MODULE$.println("end");  
  13. }  

两个都是编译成Function0,但是看看下面主函数的反编译,test1的的when evaluated被编译到次处,然后才调用test1 
Java代码   收藏代码
  1. public final Object apply()  
  2. {  
  3.   this.$outer.test(new FunctionTest2..anonfun.1());  
  4.   
  5.   Predef..MODULE$.println("when evaluated");  
  6.   
  7.   this.$outer.test1(  
  8.     new FunctionTest2..anonfun.2());  
  9.   
  10.   return BoxedUnit.UNIT;  
  11. }  

下面是test{}块反编译: 
Java代码   收藏代码
  1. public final class FunctionTest2$$anonfun$1 extends AbstractFunction0.mcV.sp  
  2.   implements Serializable  
  3. {  
  4.   public static final long serialVersionUID = 0L;  
  5.   
  6.   public final void apply()  
  7.   {  
  8.     apply$mcV$sp(); }   
  9.   public void apply$mcV$sp() { Predef..MODULE$.println("when evaluated");  
  10.     Predef..MODULE$.println("bb");  
  11.   }  
  12. }  

下面是test1{}块反编译: 
Java代码   收藏代码
  1. public final class FunctionTest2$$anonfun$2 extends AbstractFunction0.mcV.sp  
  2.   implements Serializable  
  3. {  
  4.   public static final long serialVersionUID = 0L;  
  5.   
  6.   public final void apply()  
  7.   {  
  8.     apply$mcV$sp(); }   
  9.   public void apply$mcV$sp() { Predef..MODULE$.println("bb");  
  10.   }  
  11. }  


这里说明了传名参数=>和零参数函数()=>的区别了,后者是参数函数先计算运行了返回()=>实例在传给test1的,porgarmming in scala专门有一章节讲述byName Paramter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值