例如,do以下代码中是否存在影响程序的行为?
while true do
puts "Hi"
break
end
while true
puts "Hi"
break
end
Run Code Online (Sandbox Code Playgroud)
根据The Ruby Programming Language一书第5.2.1节:
的
do一个关键字while或until环就像then在一个关键字if的语句:它可能完全只要一个新行(或分号)出现在循环条件和循环体之间被省略.
所以,不,它不会改变行为,它只是可选的语法.
我们来看看吧!
为了快速回答,我们可以查看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