Есть ли в Ruby встроенная функция while?

В Ruby есть множество условных конструкций, включая _1 _ / _ 2_, _3 _ / _ 4_ и т. Д.

Блок while из C:

while (condition) {
    ...
}

можно напрямую перевести на Ruby:

while condition 
    ...
end

Однако я не могу найти встроенный эквивалент в Ruby для C-подобного блока do ... while, в котором содержимое блока выполняется хотя бы один раз:

do { 
    ... 
} while (condition);

Какие-либо предложения?


person Cristian Diaconescu    schedule 10.10.2008    source источник
comment
См. Также: stackoverflow .com / questions / 136793 /.   -  person AndrewR    schedule 12.10.2008


Ответы (3)


... Лучшее, что я мог придумать, - это конструкция loop с break в конце:

loop do
    ...
    break unless condition
end
person Cristian Diaconescu    schedule 10.10.2008
comment
Да, именно такой подход рекомендовал Мац. см. blade.nagaokaut.ac.jp/cgi -bin / scat.rb / ruby ​​/ ruby-core / 6745 - person Siwei; 23.05.2012

Ты можешь сделать

i=1
begin
  ...
  i+=1 
end until 10==x

(вы также можете добавить предложение while в конец begin..end)

см. стр. 128 книги Flanagan / Matz Ruby Prog'g Lang: Это то, что может быть удалено в выпусках после 1.8

person Gene T    schedule 10.10.2008
comment
Это был бы прямой перевод do ... в то время как из C. Это комментарий Матца заставляет меня немного нервничать по поводу использования этого - person Cristian Diaconescu; 10.10.2008
comment
Думаю, мне стоит начать тестирование версии 1.9 в ubuntu и OS X, это несложно blog.michaelgreenly.com/2007/12/ - person Gene T; 10.10.2008

Ты можешь использовать

while condition
  ...
end
person IDBD    schedule 10.10.2008
comment
while условие не то же самое, что и do while condition. в случае do while код выполняется хотя бы один раз. - person mat kelcey; 10.10.2008
comment
Суть вопроса заключалась в том, что очевидно, как сделать while (condition){...}, но не так очевидно, как сделать do{...} while(condition), который запускает внутренний блок хотя бы один раз, несмотря ни на что. - person Cristian Diaconescu; 10.10.2008