对于某些构造,我可以选择使用分号或do
关键字来分隔语句的结尾,如until
下面的示例所示.
until x == 100 do puts x; x+=1 end until x == 100; puts x; x+=1 end
但这是不可能的Kernel.loop
.
x=0 loop do puts x; x+=1; break if x == 100 end x=0 loop; puts x; x+=1; break if x == 100 end # => error
这有什么原因吗?
loop
是一个方法(in Kernel
),真正需要一个块do...end
或{ }
.
while
并且until
是陈述(如if
),并且不要指望一个块.该do
关键字是可选的,但它并不表示一个块(例如while x == 100 { puts x; x+=1; }
就会失败,而loop { puts x; x+=1; break if x == 100 }
将工作得很好.)
因此,do
在两种情况下意味着不同的东西.在loop
(和其他方法)的情况下,它实际上表示一个块; 在等等的情况下while
,until
它只是语法糖(就像then
之后的那样if
.)不要被误导.