在ruby中使用`除非’的`next`时执行顺序混淆
next
语句用于跳过循环的一部分并继续循环的下一次迭代。 它可以与for
和while
语句结合使用。
我看到人们使用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 。