在ruby中使用`除非’的`next`时执行顺序混淆

next语句用于跳过循环的一部分并继续循环的下一次迭代。 它可以与forwhile语句结合使用。

我看到人们使用next,如果在评估某些条件后存在复杂的代码,即

 next if @state!=:some_state # some long complicated code 

现在我在IRB玩了next ,如下所示:

 n = 1 loop do n = n + 1 next unless n == 10 print "Good" break end # Good=> nil 

以上是理解的。 很清楚。

 n = 1 #=> 1 loop do print "#{n}" n = n + 1 next puts "hi" unless n == 5 p "good" break end #1hi #2hi #3hi #4"good" #=> nil 

在上面的代码中,无法理解行puts "hi"顺序, unless n == 5执行unless n == 5 。 先执行哪个?

下面的一个导致infinite Loop

 n = 1 #=> 1 loop do print "#{n}" n = n + 1 next puts "hi"; 2 + 3 unless n == 5 p "good" break end 

而这个很好:

 n = 1 #=> 1 loop do print "#{n}" n = n + 1 next puts "hi", 2 + 3 unless n == 5 p "good" break end #1hi #5 #2hi #5 #3hi #5 #4"good" #=> nil 

请帮助我在这里理解 – 这个如何解决forever循环?

分号被视为换行符,因此:

 next puts "hi"; 2 + 3 unless n == 5 

相当于:

 next puts "hi" 2 + 3 unless n == 5 

因此,将始终调用next并且您将拥有无限循环。

逗号被传递为传递一组参数(通过puts方法签名解释为数组),因此:

 next puts "hi", 2 + 3 unless n == 5 

相当于:

 next puts("hi", 2 + 3) unless n == 5 

关于puts的执行顺序, unless – 考虑以下因素:

 unless n == 5 next puts "hi" end 

在这个例子中,很明显unless首先计算, unless如果传递的条件被评估为假,则执行next puts "hi"语句。 好:

 next puts "hi" unless n == 5 

是完全相同的简写。 因此,始终会首先评估unless修饰符。 当然,如果在中间插入分号,则会导致对其进行不同的计算,因为分号被评估为换行符。

条件必须先执行,否则,它甚至会知道是否要评估涉及该语句的任何表达式?

至于第二个问题,循环忽略下一个表达式的值,表达式中的值仅用于从块返回值。 所以,唯一让你的循环结束的是rest