2015-05-21 121 views
2

我有拉姆达的我想在同一时间运行所有的兰巴年代,该阵列可以有任意数量兰巴的,这使得它很难的数组。既然你只能枚举一个数组。红宝石重试阵#每个循环

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开始重试args.each循环,并增加n。等等。

只有我得到一个SyntaxError: (irb):76: Invalid retry你怎么会重试每个循环,使其从一开始就

我读了关于ruby loops and the retry method here.矿似乎符合正确的语法启动它,而是因为它的内循环一个循环可能会让人困惑。目前它坐在args循环中,这是我想要重置的循环。

+0

我很困惑你在这里试图做什么。除非每次调用它时,对于相同的输入都有一个lambda返回不同的值,否则lam.call(n)== false'总是返回false,因为您刚完成检查(在'until'条件中)那lam.call(n)'在那之前就是真的吗? – Ajedi32

+0

对不起,这是一个永远不会被击中的问题的重要组成部分,因为直到它找到一个解决方案,直到块将迭代,从而使重试无用。我需要参数迭代重新开始,这是一个非常痛苦的过程。这样做是太meta。 – TheLegend

回答

3

由于retry是红宝石关键字,解析器希望看到无论是本地环路或周围开始救援,结束条件。有没有一个解析器卡住了(Array#each不是红宝石环路,这是显而易见的红宝石方法数组实例调用。)可能的解决办法是:

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 
0

这里是另一种方式做到这一点。一旦args的每个实例都为真,它只会打破循环。这是危险的,因为它永远不能满足循环,并无限期地继续下去

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