【问题标题】:Array of procs or array of lambdasprocs 数组或 lambdas 数组
【发布时间】:2016-02-09 02:14:31
【问题描述】:

有没有办法在 ruby​​ 中创建一个 lambdas 数组或一个 procs 数组?我已经能够定义每个数组,但我无法弄清楚在数组中调用 lambdas/procs 的语法。

作为一个愚蠢的虚构例子,考虑一下:

a = [ 1, 2, 3, 4, 5, 6, 7, 8]
b = [2, 3, 5, 7, 10]

c = [
  Proc.new { |x| a.include? x },
  Proc.new { |x| true },
  Proc.new { |x| b.include? x }
]

def things_checker(element, checks)
  z = 0
  checks.each do |check|
    p z
    break unless check(element)
    z = z + 1
  end
end

things_checker(3, c)

我想不出办法让check(element) 不是语法错误。

【问题讨论】:

  • 如何在数组外调用 Lamba/proc?

标签: ruby lambda


【解决方案1】:

在 Ruby 中有很多方法可以调用 proc。所有这些都会起作用:

break unless check.call(element)
break unless check.(element)
break unless check[element]

甚至:

break unless check === element

恕我直言,在您提供的示例中,后者在语义上大多是正确的。它之所以有效,是因为发明了三重相等,也称为大小写相等,用于在case 语句中检查调用参数的结果是否为真。

【讨论】:

    【解决方案2】:

    你使用call 来执行一个proc/lambda:

    def things_checker(element, checks)
      z = 0
      checks.each do |check|
        p z
        break unless check.call(element)
        z = z + 1
      end
    end
    

    【讨论】:

      【解决方案3】:

      lambda / proc 可以用#[]#call 调用

      a = Proc.new { |x| x > 10 }
      a[11] # => true
      a.call(9) # => false
      

      【讨论】:

        【解决方案4】:

        你只需要一个额外的.

        break unless check.(element)
        

        试运行:

        $ ruby
        a = [ 1, 2, 3, 4, 5, 6, 7, 8]
        b = [2, 3, 5, 7, 10]
        
        c = [
          Proc.new { |x| a.include? x },
          Proc.new { |x| true },
          Proc.new { |x| b.include? x }
        ]
        
        def things_checker(element, checks)
          z = 0
          checks.each do |check|
            p z
            break unless check.(element)
            z = z + 1
          end
        end
        
        things_checker(3, c)
        

        0
        1
        2
        

        【讨论】:

          猜你喜欢
          • 2014-12-23
          • 2012-07-21
          • 1970-01-01
          • 2013-03-11
          • 2015-08-04
          • 1970-01-01
          • 1970-01-01
          • 2012-08-27
          • 2021-03-23
          相关资源
          最近更新 更多