Ruby重试数组#每个循环

时间:2015-05-21 09:06:20

标签: ruby loops

我有一系列lambda&s;我想同时运行所有lamba' s数组可以有任意数量的lamba' s这使得它很难。因为你只能枚举一个数组。

def detect_int(*args)
  return 1 if args.empty?

  n = 1
  args.each do |lam|
     until lam.call(n) do
       n += 1
     end
     retry if lam.call(n) == false
  end
  n
end

这个方法应该在理论上有效,它应该增加计数,直到lam1.call(n)返回true。然后它将移动到下一个lam,如果lam2.call(n)返回false,它应该再次使用从lam1开始的递增n重试args.each循环。等等。

只有我得到一个SyntaxError: (irb):76: Invalid retry你将如何重试每个循环以便它从头开始

我正在阅读ruby loops and the retry method here.我的语法似乎正确适合语法,但因为它在循环中的循环可能会让人感到困惑。目前它坐在args循环中,这是我想要重置的循环。

2 个答案:

答案 0 :(得分:3)

由于retry是一个ruby关键字,解析器希望看到本机循环或开始 - 救援结束条件。没有人,解析器卡住(Array#each不是ruby循环,它是数组实例上的普通ruby 方法的调用。)可能的解决方案将是:

args.each do |lam|
  begin # grant parser with a scope
    until lam.call(n) do
      n += 1
    end
    raise if lam.call(n) == false
  rescue
    retry
  end
end

答案 1 :(得分:0)

这是另一种方法。一旦args的每个实例都为真,它只会打破循环。这很危险,因为它永远无法满足循环并无限期地继续

n = 1
while true do
  args.all? { |lam| lam.call(n) } and return n
  n += 1
end