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

Ste*_*ven 7 ruby

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

while true do
    puts "Hi"
    break
end

while true
    puts "Hi"
    break
end
Run Code Online (Sandbox Code Playgroud)

Die*_*zar 7

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

do一个关键字whileuntil环就像then在一个关键字 if的语句:它可能完全只要一个新行(或分号)出现在循环条件和循环体之间被省略.

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


Jon*_*nah 6

我们来看看吧!

为了快速回答,我们可以查看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)
Run Code Online (Sandbox Code Playgroud)

不.这两个示例执行完全相同的指令,因此我们可以选择更容易阅读的样式.一个普遍的偏好是尽可能省略do:https://github.com/bbatsov/ruby-style-guide#no-multiline-while-do