現在、ハッシュ オブジェクト内に格納されているキーのコレクションが Ruby コードに含まれています。新しい要素を追加するときは、そのキーが既に存在するかどうかを確認し、存在しない場合は、次のようにデフォルト値で新しいキーをコレクションに追加します。
unless @issues.has_key?(issue_id)
@issues[issue_id] = '';
end
しかし、私はこの方法が好きではありません。不要な値を使用せずに、それを改善することは可能ですか?
ハッシュにはデフォルト値を使用できます
h = Hash.new("")
h[issue_id] => ""
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!"> ]