对于某些构造,我可以选择使用分号或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
有这样的原因吗?
答案 0 :(得分:6)
loop
是一种方法(在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
一样。)不要被误导。