1

現在、ハッシュ オブジェクト内に格納されているキーのコレクションが Ruby コードに含まれています。新しい要素を追加するときは、そのキーが既に存在するかどうかを確認し、存在しない場合は、次のようにデフォルト値で新しいキーをコレクションに追加します。

unless @issues.has_key?(issue_id)
   @issues[issue_id] = '';
end

しかし、私はこの方法が好きではありません。不要な値を使用せずに、それを改善することは可能ですか?

4

2 に答える 2

1

ハッシュにはデフォルト値を使用できます

h = Hash.new("")
h[issue_id] => ""
于 2013-02-22T16:27:47.143 に答える
1

を使用しSetます。

セットは、一意のオブジェクトのコレクションです (繰り返しはありません)。

# @issues = Set.new

unless @issues.include?(issue_id)
  @issues << issue_id
end

ハッシュのこれらのキーは、実際にはセットです (ただし、必ずしも Set クラスを介して実装されるとは限りません)。

[編集]複雑なオブジェクト (たとえば、数値、文字列、記号などのビルトイン以外) を格納する場合は、適切にハッシュできるようにhashメソッドとメソッドのeql?両方をオーバーライドする必要があることに注意してください。複雑なオブジェクトをハッシュのキーとして使用している場合も同様です。

class Foo
  attr_read :name, :hash
  def initialize(name)
    @name = name
    @hash = name.hash
  end
  def eql?(o)
    o.is_a?(Foo) && (o.name == self.name)
  end
end

s = Set.new
s << Foo.new("Foo!")
s << Foo.new("Foo!")
s.to_a # => [ #<Foo:0x0123 @name="Foo!"> ]
于 2013-02-22T16:14:03.903 に答える