为什么“循环做”会抛出无效值错误?

时间:2016-12-17 13:25:20

标签: ruby-on-rails ruby loops

我在我看来使用琐碎的代码,比如这个

loop do 

    i++

    break if i > 5

end 

但是当我尝试跑步时,我会得到void value expression break if i > 5

我做错了什么?这个错误意味着什么?

3 个答案:

答案 0 :(得分:2)

i = 0
loop do
  i += 1
  break if i > 5
end

答案 1 :(得分:2)

是什么让你认为i++本身就是有效的Ruby代码?

虽然Ruby语法通常很容易猜到,但不要认为它类似于其他语言结构。

Ruby也有更好的模式来做事。我的第二个例子是你想要的一个例子。

i = 0
loop do 
    i = i + 1 # or shorthand i += 1
    puts i
    break if i > 5
end 

实际上,这会计入6.您的break应该在开头。

更好的方法

1.upto 5 do |i|
 puts i
end

这计为5。

答案 2 :(得分:1)

i++可能完全有效。例如,

1++ 3
  #=> 4
1++

3
  #=> 4

这是因为这两个表达式都被解析为

1 + +3

然后到

1 + 3
  #=> 4

因此,您的表达式等同于

loop do 
  i + (break if i > 5)
end 

引发了void value异常,因为break if i > 5未返回值。

你想要

i = 0
loop do 
  i += 1
  break if i > 5
end
i #=> 6

或(我的偏好)

i = 0
loop do 
  i += 1
  raise StopIteration if i > 5
end
i #=> 6

Kernel#loop通过突破循环来处理StopIteration异常。