zoukankan      html  css  js  c++  java
  • Ruby系列:玩转闭包(Block,Proc,lambda)

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

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

    arr = [1,2,3,4,5]
    arr.each{|item| puts item}

    Proc也是一个代码块,相当于过程吧
    Ruby代码 :
    a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}
    a_proc.call(9, 1, 2, 3)   #=> [9, 18, 27]
    Proc.new新建一个Proc对象时,可以不带一个block,只是在定义Proc的方法上带一个block,这个block会变成属于Proc的。

    Ruby代码 :

    def proc_from
      Proc.new
    end

    proc = proc_from { "hello" }
    proc.call   #=> "hello"

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

    Ruby代码
    def gen_times(factor)
      return Proc.new {|n| n*factor }
    end

    times3 = gen_times(3)
    times5 = gen_times(5)

    times3.call(12)               #=> 36
    times5.call(5)                #=> 25
    times3.call(times5.call(4))   #=> 60

    lambda也是匿名函数

    Ruby代码
    a_lambda = lambda {|a| puts a}
    a_lambda.call("samsam")

     lambda返回的是一个Proc对象。

    Ruby代码

    a_lambda.class #=>Proc

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

    Ruby代码

    def foo  
        f = Proc.new { return "return from foo from inside proc" }  
        f.call # control leaves foo here  
        return "return from foo"   
      end  
        
      def bar  
        f = lambda { return "return from lambda" }  
        puts f.call # control does not leave bar here  prints "return from lambda"
        return "return from bar"   
      end  
        
      puts foo # prints "return from foo from inside proc"   
      puts bar # prints "return from bar"  

  • 相关阅读:
    django with mysql (part-4)
    django with mysql (part-3)
    django with mysql (part-2)
    [LeetCode] 22. 括号生成(回溯/DP)
    [算法]求满足要求的进制(辗转相除(欧几里得算法),求最大公约数gcd)
    [算法]体积不小于V的情况下的最小价值(0-1背包)
    [LeetCode]96. 不同的二叉搜索树(DP,卡特兰数)
    [LeetCode]98. 验证二叉搜索树
    [LeetCode]21. 合并两个有序链表(递归)
    [LeetCode]538. 把二叉搜索树转换为累加树
  • 原文地址:https://www.cnblogs.com/shineqiujuan/p/1737273.html
Copyright © 2011-2022 走看看