繁体   English   中英

红宝石中的“下一个”与“除非”时执行顺序混乱

[英]Confusion with the order of execution when `next` with `unless` in ruby

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

我看到人们在评估某些条件后,如果有复杂的代码,则使用next

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

现在在这里,我在IRBnext ,如下所示:

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 == 5unless 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM