2013-10-24 1 views
2

Следующий код работает:Что недействительно в Ruby?

collection.each do |i| 
    begin 
    next if i > 10 
    i += 1 
    rescue 
    puts "could not process #{ i }" 
    end 
end 

Однако, когда мы реорганизовать:

collection.each do |i| 
    begin 
    increment i 
    rescue 
    puts "could not process #{ i }" 
    end 
end 

def increment i 
    next if i > 10 
    i += 1 
end 

Я получаю invalid next ошибку. Это ограничение Ruby (1.9.3)?

Работает ли блок begin rescue, если существует исключение в методе инкремента?

+0

Мой вопрос - что он ожидает от «следующего»? –

+0

Да, это упрощенный пример. Если бы я опубликовал производственный код, это заслонит вопрос. –

+0

Это не «ограничение», это дизайнерское решение и * хороший * один. Вы не должны * переносить «следующий» из контекста цикла. Вы не можете ни на каком другом языке. – meagar

ответ

9

Ваш оператор next должен находиться внутри цикла. В вашем методе increment нет петли.

Исключения будут «пузыряться», поэтому, если есть исключение в вашем методе increment, он будет пойман секцией rescue вызывающего метода.