Может быть
Да , если вы говорите о МРТ , и вопрос: " Пройдет ли итератор мои новые элементы? ".
Если вы говорите о Ruby как о языке, " возможно ".Спецификации не существует, поэтому MRI служит эталонной реализацией.
Но, сказав, что это просто кажется чем-то, что будет зависеть от реализации, отчасти потому, что требование какого-либо конкретного поведения наложит ограничение на реализации без ясностивыгоды, но с определенными компромиссами производительности.
Это также весьма императив , , так что это, возможно, не "путь Руби", которыйбольше склоняется к функциональным стилям .
Вот как я думаю, что хорошая программа на Ruby должна писать такой цикл.Это выражение будет возвращать старый массив a до тех пор, пока он не изменится, и в этом случае он создаст новый массив в функциональном стиле, чтобы никогда не возникало никаких сомнений относительно того, каким будет результат ...
>> a = [1, 2, 3]
=> [1, 2, 3]
>> a.inject(a) { |m, e| e < 99 ? m + [99] : m }
=> [1, 2, 3, 99, 99, 99]
A быстрее(если будет добавлено много новых элементов) полуфункциональное выражение будет:
t = a.inject(a.dup) { |m, e| e < 99 ? m << 99 : m }