为什么 `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
while
和for
不是方法而是关键字,相关的构造内置于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
为什么这两种样式都有效?它们在基本层面上有什么不同吗?
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
while
和for
不是方法而是关键字,相关的构造内置于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