ruby 中的Block,lambda,Proc

Block,lambda,Proc在Ruby中很重要。

  • Block块就是一个匿名函数,被调用的方法调用,在调用的方法里面通过field调用。Block主要用于迭代。
Ruby代码
  1. arr = [1,2,3,4,5]  
  2. arr.each{|item| puts item}  
  • Proc也是一个代码块,相当于过程吧
Ruby代码 
  1. a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}  
  2. a_proc.call(9, 1, 2, 3)   #=> [9, 18, 27]  

   Proc.new新建一个Proc对象时,可以不带一个block,只是在定义Proc的方法上带一个block,这个block会变成属于Proc的。

Ruby代码 
  1. def proc_from  
  2.   Proc.new  
  3. end  
  4.   
  5. proc = proc_from { "hello" }  #pro_form返回一个pro对象,然后后面带有{},相当于pro{"hello"}
  6. proc.call   #=> "hello"  

 Proc对象是与局部变量绑定的一个代码块。绑定之后,代码可以在不同的上下文中调用,并可以访问局部变量。

Ruby代码 
  1. def gen_times(factor)  
  2.   return Proc.new {|n| n*factor }  
  3. end  
  4.   
  5. times3 = gen_times(3)  
  6. times5 = gen_times(5)  
  7.   
  8. times3.call(12)               #=> 36  
  9. times5.call(5)                #=> 25  
  10. times3.call(times5.call(4))   #=> 60  
 
  • lambda也是匿名函数
Ruby代码 
  1. a_lambda = lambda {|a| puts a}  
  2. a_lambda.call("samsam")  

  lambda返回的是一个Proc对象。

Ruby代码 
  1. a_lambda.class #=>Proc  

 lambda和Proc是一样的,除了Proc的return会跳出调用的方法,lambda则不会,它只是返回自己。

Ruby代码   收藏代码
  1. def foo    
  2.     f = Proc.new { return "return from foo from inside proc" }    
  3.     f.call # control leaves foo here    
  4.     return "return from foo"     
  5.   end    
  6.       
  7.   def bar    
  8.     f = lambda { return "return from lambda" }    
  9.     puts f.call # control does not leave bar here  prints "return from lambda"   
  10.     return "return from bar"     
  11.   end    
  12.       
  13.   puts foo # prints "return from foo from inside proc"     
  14.   puts bar  prints "return from bar"  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值