在ruby中存储单个键的常用方法

时间:2013-02-22 15:28:37

标签: ruby hash

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

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

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

2 个答案:

答案 0 :(得分:1)

使用Set

集合是唯一对象的集合(无重复)。

# @issues = Set.new

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

哈希的哈希键实际上是一个集合(虽然不一定通过Set类实现)。

[编辑] 请注意,如果您要存储复杂对象(例如,不是内置数据,字符串,符号等),则需要覆盖hash methodeql? method以便可以正确地进行哈希处理。如果您使用复杂对象作为散列键,也是如此。

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!"> ]

答案 1 :(得分:1)

您可以使用哈希值

的默认值
h = Hash.new("")
h[issue_id] => ""