【问题标题】:Why does Array#delete skip "blue" and print "green" when I delete "green?"当我删除“green”时,为什么 Array#delete 会跳过“blue”并打印“green”?
【发布时间】:2014-09-22 18:59:01
【问题描述】:
array=['red', 'green', 'blue', 'purple']
array.each do | color |
  puts(color)
  if color == 'green'
    array.delete(color)
  end
end

这会打印出红色、绿色、紫色。我知道 array.delete 以某种方式弄乱了迭代,但我的问题是为什么以及如何?引擎盖后面发生了什么?如果我将 array.delete(color) 替换为 array

【问题讨论】:

    标签: ruby arrays iterator


    【解决方案1】:

    在您原来的array 中,green1 索引中。因此,在第二次迭代中,当您的if 表达式被评估为true 时,您正在从原始array 中删除实际条目green。因此blue 进入索引1。这就是为什么在第三次迭代中,3rd 元素是 purple,这就是您在预期输出中缺少 "blue" 的原因。

    您可以如下调试它:-

    array=['red', 'green', 'blue', 'purple']
    array.each do | color |
      if color == 'green'
        array.delete(color)
      end
      # printing array to debug the actual array content after each iteration
      p array
    end
    # >> ["red", "green", "blue", "purple"]
    # >> ["red", "blue", "purple"]
    # >> ["red", "blue", "purple"]
    

    【讨论】:

      【解决方案2】:

      在您迭代之前改变您的数组,并在循环中动态更改您的索引。例如:

      array = %w[red green blue purple]
      array.delete 'green'
      array.each { |color| puts color }
      

      这正确产生:

      $ ruby colors.rb 
      red
      blue
      purple
      

      【讨论】:

        猜你喜欢
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多