过程数组或lambda数组

时间:2016-02-09 02:14:32

标签: ruby lambda

有没有办法在ruby中创建一个lambdas数组或一个proc数组?我已经能够定义每个数组的数组,但是我无法弄清楚在数组中调用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)成为语法错误的方法。

4 个答案:

答案 0 :(得分:4)

有许多方法可以在Ruby中调用proc。所有这些都可行:

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

甚至:

break unless check === element

恕我直言,在你提供的例子中,后者在语义上大多是正确的。它起作用,因为三重相等,也称为大小写相等,被发明用于case语句,以检查对参数的调用结果是否真实。

答案 1 :(得分:3)

使用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

答案 2 :(得分:3)

可以使用#[]#call

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

答案 3 :(得分:2)

您只需要额外的.

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