[英]Confusion with the order of execution when `next` with `unless` in ruby
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
在上面的代码中, unless n == 5
, unless n == 5
无法理解puts "hi"
哪个顺序。 哪个先执行?
下面的内容导致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
方法签名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
如果传递的条件被评估为false,则将执行next puts "hi"
语句。 好:
next puts "hi" unless n == 5
是完全相同的事物的简写。 因此, unless
修饰符总是会首先被评估。 自然地,如果在中间插入分号,则会导致对分号的评估不同,因为分号被评估为换行符。
条件语句必须首先执行,否则,它将如何知道是否要评估涉及该语句的任何表达式?
关于第二个问题,循环将忽略下一个表达式的值,该表达式中的值仅对从块返回值有用。 因此,使循环结束的唯一原因是break 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.