2013-03-04 75 views
2

与`unless` next`的next语句用于跳过循环的一部分,并继续循环的下一次迭代的执行顺序。它可以结合使用forwhile语句。混淆,当`在红宝石

我已经看到了使用下一个人如果有复杂的代码后,一定条件下被评估,即

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"和​​执行的线。哪个先执行?

下面一个通向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循环?

+0

可能重复的[是从'下一个'坏主意返回一个值?](http://stackoverflow.com/questions/9561187/is-returning-a-value-from-next-a-bad-idea ) – sawa 2013-03-04 22:05:43

+2

@sawa:这不是真正相关的,因为OP想知道何时会根据尝试的条件修饰符执行'next' – PinnyM 2013-03-04 22:12:58

+1

@sawa您能否删除该链接,因为它与我的问题无关? – 2013-03-04 22:23:39

回答

5

一个分号evaled当做一个换行符这样:

next puts "hi"; 2 + 3 unless n == 5 

将相当于:

next puts "hi" 
2 + 3 unless n == 5 

因此,next会一直叫,你就会有一个无限循环。

的逗号evaled作为传递一组参数(这被解释为通过puts方法签名的阵列),所以:

next puts "hi", 2 + 3 unless n == 5 

相当于:

next puts("hi", 2 + 3) unless n == 5 

关于执行订购putsunless - 请考虑以下事项:

unless n == 5 
    next puts "hi" 
end 

在这个例子中,很明显,unless首先计算,那么如果为假执行next puts "hi"声明通过了评估条件。那么:

next puts "hi" unless n == 5 

是完全相同的事情的简写。所以unless修饰符将始终首先评估。当然,如果你在中间插入一个分号,它会导致这种情况有不同的评估,因为分号被当做一个换行符评估。

+0

你能帮我解决我的第一个问题吗? – 2013-03-04 22:48:38

+0

@iAmRubuuu - 为此更新。 – PinnyM 2013-03-05 14:40:21

+0

感谢您照顾我的痛苦。我一直在等你,听听其他人的消息。最后你听到了我的声音。 :)我很高兴 – 2013-03-05 14:46:35

0

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

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

+0

为了清楚理解你能解释一下你的答案吗?在'next puts'hi',当条件评估为'false'时,除非n == 5',否则执行'next',然后控制应该到达块的开始。但是如果是这样的话,那么''你好''已经被执行了。这里我太困惑了。这种说法如何在现实中起作用? – 2013-03-05 08:01:10

+0

尽管在循环内传递给next的表达式不会被返回,但它仍然会被评估。这就是为什么'next puts“hi”'会产生输出。 – PinnyM 2013-03-05 14:42:29