该next语句用于跳过循环的一部分并继续循环的下一次迭代.它可以for与while语句结合使用.
我已经看到人们使用next,如果在评估某些条件后存在复杂的代码,即
next if @state!=:some_state
# some long complicated code
Run Code Online (Sandbox Code Playgroud)
现在,这里我已经与发挥next我的IRB如下:
n = 1
loop do
n = n + 1
next unless n == 10
print "Good"
break
end
# Good=> nil
Run Code Online (Sandbox Code Playgroud)
以上是理解的.很清楚.
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
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,无法了解线路puts "hi"和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
Run Code Online (Sandbox Code Playgroud)
而这个很好:
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
Run Code Online (Sandbox Code Playgroud)
请帮助我在这里理解 - 这个怎么解决这个forever循环?
分号被视为换行符,因此:
next puts "hi"; 2 + 3 unless n == 5
Run Code Online (Sandbox Code Playgroud)
相当于:
next puts "hi"
2 + 3 unless n == 5
Run Code Online (Sandbox Code Playgroud)
因此,next将永远被调用,你将有一个无限循环.
逗号被传递为传递一组参数(通过puts方法签名解释为数组),因此:
next puts "hi", 2 + 3 unless n == 5
Run Code Online (Sandbox Code Playgroud)
相当于:
next puts("hi", 2 + 3) unless n == 5
Run Code Online (Sandbox Code Playgroud)
关于执行顺序puts和unless-考虑以下几点:
unless n == 5
next puts "hi"
end
Run Code Online (Sandbox Code Playgroud)
在这个例子中,很明显unless首先进行评估,然后如果传递的条件被评估为false,next puts "hi"则执行该语句.好:
next puts "hi" unless n == 5
Run Code Online (Sandbox Code Playgroud)
是完全相同的简写.因此,unless将始终首先评估修改器.当然,如果在中间插入分号,则会导致对其进行不同的计算,因为分号被评估为换行符.