有没有办法在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)
成为语法错误的方法。
答案 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
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