什么时候Ruby中需要do关键字?

例如,以下代码中是否存在do会影响程序的行为吗?

 while true do puts "Hi" break end while true puts "Hi" break end 

根据The Ruby Programming Language一书第5.2.1节:

whileuntil循环中的do关键字与if语句中的then关键字类似:只要在循环条件和循环体之间出现换行符(或分号),就可以完全省略它。

所以,不,它不会改变行为,它只是可选语法。

我们来看看吧!

为了快速回答,我们可以查看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