Ruby数组删除vs删除(bang)

时间:2013-03-29 12:13:52

标签: ruby arrays

我认为Array#delete删除了一个数组中对象的所有副本,但是在我编写的这个程序中发生了一些奇怪的事情(对我来说是莫名其妙的)。当我在删除功能的末尾包含一个爆炸时,删除似乎只能起作用,即使这似乎没有被定义。

这是有问题的功能:

  def propagate
    @puzzle.each do |sqr, values|
      if values.length == 1
        @neighbors[sqr].each do |neighbor|
          @puzzle[neighbor].delete!(values)
        end 
      end 
    end 
  end 

@puzzle是一个哈希,字符串作为键和值,格式如下:@puzzle["A1"] = "123456789"

@neighbors是一个散列,其中字符串作为键,字符串数组作为值:

@neighbors["A1"] = ["A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "B1", "C1", "D1", "E1", "F1", "G1", "H1", "I1", "B2", "B3", "C2", "C3"]

当我运行这样的代码时:@puzzle[neighbor].delete(values)

拼图中的值不受删除的影响。但是当我加入时!它有效。

为什么会这样?

1 个答案:

答案 0 :(得分:5)

这是一个常见的习语。 Bang方法就地修改对象,“普通”方法返回修改后的副本。

您正在执行的delete!方法调用是针对字符串而不是数组。 String确实有方法delete!http://www.ruby-doc.org/core-1.9.3/String.html#method-i-delete-21