阅读 46

玩转Ruby系列:玩转闭包(Block,Proc,lambda)

玩转Ruby系列:玩转闭包(Block,Proc,lambda) - SamSam - ITeye技术网站

玩转Ruby系列:玩转闭包(Block,Proc,lambda)

    博客分类:
  • Ruby/Rails

RubyF#BlogHTML 

Block,lambda,Proc要好好理解下,在Ruby中很重要。

  • Block块就是一个匿名函数,被调用的方法调用,在调用的方法里面通过field调用。Block主要用于迭代。

  1. arr = [1,2,3,4,5]  

  2. arr.each{|item| puts item}  

  • Proc也是一个代码块,相当于过程吧

  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的。

  1. def proc_from  

  2.   Proc.new  

  3. end  

  4.   

  5. proc = proc_from { "hello" }  

  6. proc.call   #=> "hello"  

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

  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也是匿名函数

  1. a_lambda = lambda {|a| puts a}  

  2. a_lambda.call("samsam")  

 
lambda返回的是一个Proc对象。

  1. a_lambda.class #=>Proc  

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

  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"     

参考:

http://www.ruby-doc.org/core/

http://www.artima.com/intv/closures.html

http://blackanger.blog.51cto.com/140924/83700


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐