Могу ли я вернуться к началу метода, используя 'redo' в Ruby? - PullRequest
4 голосов
/ 22 марта 2009

В Poignant Guide приведен пример ключевого слова redo:

class LotteryTicket
  def self.new_random
    new(rand(25) + 1, rand(25) + 1, rand(25) + 1)
  rescue ArgumentError
    redo
  end
end

Он должен продолжать звонить new, пока все три случайных числа не станут уникальными. Но после того, как я набрал этот код и запустил его несколько раз, я получил эту ошибку: LocalJumpError: unexpected redo. Я искал ключевое слово redo в другом месте, и похоже, что оно должно работать только для циклов и итераторов. Так почему же попытался использовать это в своем примере? Как переписать этот метод, чтобы он работал правильно?

Ответы [ 2 ]

9 голосов
/ 22 марта 2009

Он должен был использовать retry, а не redo.

3 голосов
/ 14 июня 2011

redo перезапускает блок:

l = lambda {puts "hi"; redo}
l.call
...