代码之家  ›  专栏  ›  技术社区  ›  Arup Rakshit

ruby中“next”与“excess”时的执行顺序混淆

  •  4
  • Arup Rakshit  · 技术社区  · 13 年前

    这个 next 语句用于跳过循环的一部分并继续循环的下一次迭代。它可以与组合使用 for while 声明。

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

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

    现在我已经和 下一个 在我的 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

    2 回复  |  直到 13 年前
        1
  •  6
  •   PinnyM    13 年前

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

    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
    

    关于的执行命令 unless -考虑以下内容:

    unless n == 5
      next puts "hi"
    end
    

    在这个例子中,很明显 除非 首先计算,然后如果传递的条件被计算为false,则 next puts "hi" 语句被执行。好:

    next puts "hi" unless n == 5
    

    是完全相同事物的简写。所以 除非 修改器将始终首先进行评估。当然,如果在中间插入分号,则会导致计算结果不同,因为分号是作为换行符计算的。

        2
  •  0
  •   DigitalRoss    13 年前

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

    关于你的第二个问题 下一个 表达式对于循环被忽略,表达式中的值仅用于从块返回值。所以,唯一能让你的循环结束的是 打破 .

    推荐文章