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


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

    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" }  
    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"     

    参考:

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

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

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

  • 相关阅读:
    Nginx安装
    win卸载输入法之后,在系统设置的键盘中还有这个输入法
    为Delphi 10.4.2实现android拍照填坑
    图文解说 ChinaCock 华为扫描
    Delphi Event Bus进阶(二)GlobalEventBus是怎么来的?
    小心SecondsBetween有坑
    Delphi Event Bus进阶(一)控制订阅方法的线程模式
    Delphi 10.4.2试用报告
    Delphi Event Bus入门
    UML建模——活动图(Activity Diagram)
  • 原文地址:https://www.cnblogs.com/lexus/p/2650967.html
Copyright © 2020-2023  润新知