2015-05-21 2 views
2

У меня есть массив лямбда, я бы хотел запустить все ламбы в одно и то же время, у массива может быть любое количество lamba's, что затрудняет его. Так как вы можете только перечислить массив.Ruby retry Array # каждая петля

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. то он перейдет к следующему ламу, если lam2.call (n) возвращает false, он должен повторить цикл args.each с добавленным шагом n, начиная с lam1 снова. и так далее.

только я получаю SyntaxError: (irb):76: Invalid retry как бы вы повторить, что каждый цикл так, что он начнет с самого начала

Я читал на ruby loops and the retry method here. кажется мое, чтобы соответствовать синтаксису правильно, но потому, что его цикл в цикл может стать запутанным. в настоящее время его сидит в петле args, которая является циклом, который я хотел бы сбросить.

+0

Я смущен тем, что вы пытаетесь сделать здесь. Если у вас нет лямбды, которая возвращает разные значения для одного и того же входа каждый раз, когда вы его вызываете, 'lam.call (n) == false' всегда возвращает false, так как вы только что закончили проверку (в состоянии' до') что 'lam.call (n)' был правдивым непосредственно перед этим? – Ajedi32

+0

Да, извините, что это была большая часть проблемы, которая никогда не попадет, потому что до тех пор, пока блок не будет перебираться до тех пор, пока не найдет решение, таким образом сделав попытку бесполезной. Мне понадобилась бы итерация args, чтобы начать снова, что было очень болезненным процессом. Выполнение этого пути слишком мета. – TheLegend

ответ

3

С retry является ключевым словом ruby, парсер хочет видеть либо замкнутый цикл, либо условие начала восстановления. Там не один и анализатор застрял (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 
Смежные вопросы