Ruby中何时需要do关键字?

Ruby中何时需要do关键字?,ruby,Ruby,例如,以下代码中是否存在do会影响程序的行为 while true do puts "Hi" break end while true puts "Hi" break end 根据手册第5.2.1节: while或till循环中的do关键字类似于 if语句:只要换行符(或 分号)出现在循环条件和循环体之间 所以,不,它不会改变行为,只是可选语法。让我们来看看 要快速回答这个问题,我们可以查看Ruby的文档,并找到其中的状态 do关键字是可选的 这两个例子是等价

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

while true do
    puts "Hi"
    break
end

while true
    puts "Hi"
    break
end
根据手册第5.2.1节:

while
till
循环中的
do
关键字类似于
if
语句:只要换行符(或 分号)出现在循环条件和循环体之间

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

让我们来看看

要快速回答这个问题,我们可以查看Ruby的文档,并找到其中的状态

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)
>gem安装ruby\u解析器
>内部评级
>需要“ruby_解析器”
=>正确
>with_do=with_do=RubyParser.new.parse with_do
=>s(:while,s(:true),s(:block,s(:call,nil,:put,s(:str,“Hi”)),s(:break)),true)
>RubyParser.new.parse而不使用
=>s(:while,s(:true),s(:block,s(:call,nil,:put,s(:str,“Hi”)),s(:break)),true)

没有。这两个示例执行完全相同的指令,因此我们可以选择更容易阅读的样式。一个常见的偏好是尽可能省略
do

这很有趣(我必须看看
ruby\u解析器
),但在所有
irb
提示下阅读起来不必要的困难。我建议你删除它们。@CarySwoveland你可以编辑提示,帮助这个问题看起来更好。@diego.greyrobot,我几乎从不编辑别人写的东西。在我看来,他们拥有这些文字,所以我只能建议修改。(我知道这很老派。)当别人编辑我写的东西时,你能猜出我的反应吗?:-)谢谢@CarySwoveland,这对你来说更容易阅读吗?我总是不确定是否应该努力获得清晰的示例或输出的文字副本。“我不确定哪一个更容易被其他人模仿和复制。”“卡里斯沃夫兰,你应该这么做。”。这将提高社区其他人的内容质量:)如果有人迷路了,向他们问路,而其他人开始帮助,但你注意到他们的部分方向模棱两可,你会认为“我不应该插嘴,他们拥有他们所说的方向”。或者你能帮我理清方向吗?