2

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

如果在评估某些条件后有一段复杂的代码,我见过人们使用下一个,即

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

现在我在这里玩了next如下IRB

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执行的顺序。哪个先执行?

下面的一个导致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循环的?

4

2 回答 2

6

分号被评估为换行符,因此:

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

关于putsand unless- 的执行顺序,请考虑以下几点:

unless n == 5
  next puts "hi"
end

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

next puts "hi" unless n == 5

是完全相同的事物的简写。所以unless修饰符总是首先被评估。自然,如果您在中间插入分号,则会导致对它的评估不同,因为分号被评估为换行符。

于 2013-03-04T21:57:21.847 回答
0

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

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

于 2013-03-05T02:50:15.707 回答