【问题标题】:Kernel.loop method requires 'do' . Semicolon not allowed?Kernel.loop 方法需要 'do' 。不允许分号?
【发布时间】:2010-10-13 02:06:54
【问题描述】:
对于某些结构,我可以选择使用分号或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
这样是有原因的吗?
【问题讨论】:
标签:
ruby
syntax
loops
kernel
【解决方案1】:
-
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 之后一样。)不要被误导。