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

时间:2015-08-06 11:16:48

标签: ruby syntax

为什么这两种风格都有效?它们在基础层面上是不同的吗?

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

2 个答案:

答案 0 :(得分:3)

whilefor不是方法,而是关键字,相关结构内置于Ruby中。跟随它们的部分可能看起来类似于块,但不是块。由于它不是块,因此不需要do,但由于此构造与块的相似性,人们可能会意外地写do。因此,通过设计,do关键字在这些结构中是可选的。

答案 1 :(得分:1)

你必须有一些方式告诉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

使用 关键字表达式分隔符是多余的,但不是有害的,那么为什么它应该是错误?这就像告诉Ruby"条件在这里结束。不,真的,条件在这里结束了!"

完全与条件相同

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