0

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)

puzzle の値は、削除の影響を受けません。しかし、! を含めると、できます。

どうしてこれなの?

4

1 に答える 1

5

よくあるイディオムです。Bang メソッドはオブジェクトをその場で変更し、「通常の」メソッドは変更されたコピーを返します。

実行しているdelete!メソッド呼び出しは、配列ではなく文字列に対するものです。そしてString確かにメソッドがありますdelete!http://www.ruby-doc.org/core-1.9.3/String.html#method-i-delete-21

于 2013-03-29T12:22:32.033 に答える