Proc数组或Lambda数组

4
有没有办法在ruby中创建lambda数组或proc数组?我已经定义了每个类型的数组,但我无法弄清楚如何调用数组中的lambda / proc的语法。以一个愚蠢的虚构例子为例:
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? - Stefan
4个回答

5

在Ruby中,有许多方法可以调用proc。以下所有方法均可:

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

甚至包括:

break unless check === element

依我看,在你提供的例子中,后者大多数情况下在语义上是正确的。这是因为三个等号(也称为全等或严格相等)被发明用于case语句中,以检查参数调用的结果是否为真值。


3
您可以使用call来执行一个过程/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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接