在红宝石中使用`除非'的'next`时执行顺序混淆

Aru*_*hit 2 ruby

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

我已经看到人们使用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循环?

Pin*_*nyM 6

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

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)

关于执行顺序putsunless-考虑以下几点:

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将始终首先评估修改器.当然,如果在中间插入分号,则会导致对其进行不同的计算,因为分号被评估为换行符.