Метод Kernel.loop требует 'do'. Точка с запятой не допускается? - PullRequest
3 голосов
/ 13 марта 2009

Для определенных конструкций у меня есть выбор использовать точку с запятой или ключевое слово do для разделения конца оператора, как в примере until ниже.

until x == 100 do puts x; x+=1 end 

until x == 100; puts x; x+=1 end 

Но это невозможно с Kernel.loop.

x=0    
loop do puts x; x+=1; break if x == 100 end

x=0    
loop; puts x; x+=1; break if x == 100 end # => error

Есть ли причина, почему это так?

1 Ответ

6 голосов
/ 13 марта 2009
  • loop - это метод (в Kernel), который действительно требует блока с do...end или { }.
  • while и until являются операторами (например, if) и не ожидают блока. Ключевое слово do является необязательным, но оно не обозначает блок (например, while x == 100 { puts x; x+=1; } с треском провалится, тогда как loop { puts x; x+=1; break if x == 100 } будет работать нормально.)

Итак, do означает разные вещи в обоих случаях. В случае loop (и других методов) это действительно обозначает блок; в случае while, until и т. д. это просто синтаксический сахар (как then после if.) Не вводите в заблуждение.

...