1

目前,我的 ruby​​ 代码中有一组键,它们存储在哈希对象中。当我添加新元素时,我只是检查该键是否已经存在,如果不存在,则使用一些默认值将新键添加到我的集合中,如下所示:

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

但我不喜欢这种方法。是否有可能在不使用不必要的价值的情况下做得更好。

4

2 回答 2

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 回答
1

您可以使用哈希的默认值

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