Когда требуется ключевое слово do в Ruby?

ruby

377 просмотра

2 ответа

1445 Репутация автора

Например, присутствие или отсутствие doв следующем коде влияет на поведение программы вообще?

while true do
    puts "Hi"
    break
end

while true
    puts "Hi"
    break
end
Автор: Steven Источник Размещён: 12.01.2015 07:05

Ответы (2)


7 плюса

11405 Репутация автора

Решение

В соответствии с разделом 5.2.1 книги по языку программирования Ruby :

doКлючевое слово в whileили untilпетле , как thenключевое слово в ifзаявлении: он может быть опущен в целом до тех пор , как новая строка (или точка с запятой) появляется между состоянием контура и телом цикла.

Так что нет, это не изменит поведение, это просто необязательный синтаксис.

Автор: DiegoSalazar Размещён: 12.01.2015 07:16

6 плюса

17196 Репутация автора

Давайте разберемся!

Для быстрого ответа мы можем посмотреть документацию Ruby и найти http://www.ruby-doc.org/core-2.1.1/doc/syntax/control_expressions_rdoc.html#label- while+ Loop, в котором говорится, что

Ключевое слово do не обязательно.

Итак, эти два примера эквивалентны, но идентичны ли они? Они могут делать то же самое, но, возможно, есть причина отдать предпочтение одному из них. Мы можем посмотреть на AST, который генерируют эти примеры, и посмотреть, есть ли разница.

> gem install ruby_parser
> irb

> require 'ruby_parser'
=> true
> with_do = <<-END
 while true do
     puts "Hi"
     break
 end
 END
=> "while true do\n    puts \"Hi\"\n    break\nend\n"
> without_do = <<-END
 while true
     puts "Hi"
     break
 end
 END
=> "while true\n    puts \"Hi\"\n    break\nend\n"
> RubyParser.new.parse with_do
=> s(:while, s(:true), s(:block, s(:call, nil, :puts, s(:str, "Hi")), s(:break)), true)
> RubyParser.new.parse without_do
=> s(:while, s(:true), s(:block, s(:call, nil, :puts, s(:str, "Hi")), s(:break)), true)

Нет. Эти два примера выполняют точно такие же инструкции, поэтому мы можем выбрать любой стиль, который нам удобнее читать. Распространенным предпочтением является опускание, doкогда это возможно: https://github.com/bbatsov/ruby-style-guide#no-multiline- while-do

Автор: Jonah Размещён: 12.01.2015 07:27
Вопросы из категории :
32x32