Я использую этот код, чтобы позволить пользователю вводить имена, в то время как программа сохраняет их в массиве, пока они не введут пустую строку (они должны нажимать ввод после каждого имени):
people = []
info = 'a' # must fill variable with something, otherwise loop won't execute
while not info.empty?
info = gets.chomp
people += [Person.new(info)] if not info.empty?
end
Этот код будет выглядеть намного лучше в цикле do ... while:
people = []
do
info = gets.chomp
people += [Person.new(info)] if not info.empty?
while not info.empty?
В этом коде мне не нужно присваивать информацию какой-либо случайной строке.
К сожалению, этот тип цикла не существует в Ruby. Кто-нибудь может предложить лучший способ сделать это?
loop do; ...; break if ...; end
?Ответы:
ВНИМАНИЕ :
begin <code> end while <condition>
Отвергается автором Руби Matz. Вместо этого он предлагает использоватьKernel#loop
, например,Вот обмен электронной почтой в 23 ноября 2005 года, где Мац заявляет:
RosettaCode Wiki имеет похожую историю:
источник
begin end while
метод не показался правильным. Спасибо, что дали мне корм, который мне нужен, чтобы убедить остальную команду.Первоначально написано Джереми Вурхис . Содержание было скопировано здесь, потому что, кажется, оно было удалено с исходного сайта. Копии также можно найти в веб-архиве и на форуме Ruby Buzz . -Билл Ящерица
источник
begin .. end
это несколько осуждается. Используйтеloop do .. break if <condition>
вместо этого.Нравится:
Ссылка: Ruby's Hidden do {} while () Loop
источник
until info.empty?
а неwhile not info.empty?
.Как насчет этого?
источник
Вот полный текст статьи из мертвой ссылки Хаббардра на мой блог.
Я нашел следующий фрагмент при чтении исходного кода
Tempfile#initialize
в базовой библиотеке Ruby:На первый взгляд, я предположил, что
while
модификатор будет оценен перед содержимымbegin...end
, но это не так. Заметим:Как и следовало ожидать, цикл продолжит выполняться, пока модификатор имеет значение true.
Хотя я был бы рад никогда больше не видеть эту идиому,
begin...end
она достаточно мощная. Ниже приводится распространенная идиома для запоминания однострочного метода без параметров:Вот уродливый, но быстрый способ запомнить что-то более сложное:
источник
Теперь это работает правильно:
Но, это может быть удалено в будущем, потому что
begin
утверждение является нелогичным. Видеть: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745.Matz (Ruby's Creator) рекомендовал сделать это следующим образом:
источник
Из того, что я собираюсь, Мац не нравится конструкция
потому что это семантика отличается от
тем, что первая конструкция выполняет код в первую очередь перед проверкой условия, а вторая конструкция сначала проверяет условие перед тем, как выполнить код (если когда-либо). Я полагаю, что Матц предпочитает сохранять вторую конструкцию, потому что она соответствует одной строковой конструкции оператора if.
Мне никогда не нравилась вторая конструкция даже для операторов if. Во всех других случаях компьютер выполняет код слева направо (например, || и &&) сверху вниз. Люди читают код слева направо сверху вниз.
Вместо этого я предлагаю следующие конструкции:
Я не знаю, будут ли эти предложения разбираться с остальным языком. Но в любом случае я предпочитаю сохранять исполнение слева направо, а также согласованность языков.
источник
источник
while true
может быть заменен наloop do
.while true
можно заменить наloop do
. Но я протестировал обе конструкции с большим количеством итераций внутри цикла и обнаружил, чтоwhile true
это как минимум в 2 раза быстрее, чемloop do
. Не могу объяснить разницу, но она определенно есть. (Обнаружено во время тестирования Advent of Code 2017, день 15).Вот еще один:
источник
unless
это прямо перед собой, и я не читаю кучу кода (который может быть больше, чем показано здесь) только для того, чтобы найти «зависание»unless
в конце. В коде есть общий принцип, что модификатор и условия легче использовать, когда они «наперед», как это.источник