为什么 `do` ... `end` 和 `end` 样式块对 `while` 和 `for` 循环都有效?

Why are both `do` ... `end` and `end` style blocks valid for `while` and `for` loops?

为什么这两种样式都有效?它们在基本层面上有什么不同吗?

while true do
  puts "I am awesome"
end

while true
  puts "I am awesome"
end

for i in 1..6 do
  puts i
end

for i in 1..6
  puts i
end

whilefor不是方法而是关键字,相关的构造内置于Ruby中。它们后面的部分可能看起来类似于块,但不是块。由于它不是块,因此不需要 do,但由于这种构造与块的相似性,人们可能会不小心写成 do。因此,根据设计,do 关键字在这些结构中是可选的。

你必须有一些方法来告诉Ruby条件结束并且循环开始。 Ruby 允许您以两种不同的方式告诉它:使用关键字 do 或使用表达式分隔符(; 或换行符)。因此,以下所有内容都是等价的:

while true do puts "I am awesome" end

while true; puts "I am awesome" end

while true
  puts "I am awesome" end

使用 both 关键字 and 表达式分隔符是多余的,但无害,那么为什么它会出错?这就像告诉 Ruby "The condition ends here. No, really, the condition ends here!"

完全与条件相同:

if true then 1 else 0 end

if true; 1 else 0 end

if true
  1 else 0 end

甚至方法定义:

def foo() 'foo' end

def foo; 'foo' end

def foo
  'foo' end