Kernel.loop方法需要'do'.不允许使用分号?

3 ruby syntax kernel loops

对于某些构造,我可以选择使用分号或do关键字来分隔语句的结尾,如until下面的示例所示.

until x == 100 do puts x; x+=1 end 

until x == 100; puts x; x+=1 end 
Run Code Online (Sandbox Code Playgroud)

但这是不可能的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
Run Code Online (Sandbox Code Playgroud)

这有什么原因吗?

vla*_*adr 6

  • 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.)不要被误导.