将一个'each'like方法添加到从Hash继承的Ruby类中

时间:2014-02-08 18:47:20

标签: ruby hash

我想创建一个类似于标准Ruby Hash的类,并引入一些额外的访问方法。例如,给定:

class SpecificHash < Hash
  def initialize 
    (1..20).each do |num|
      self[num] = "value #{num.to_s}"
    end
  end
end

我可以使用标准each调用获得所有键值对的完整列表:

sh = SpecificHash.new
sh.each { |k,v| puts k } 

我有几件事我想做。要使用简化示例,我如何为odd_keys方法创建定义,让我调用:

sh = SpecificHash.new
sh.odd_keys { |k,v| puts k }

并使其像each方法一样工作但只包含键/值对,其中键是奇数?

3 个答案:

答案 0 :(得分:3)

将此方法添加到您的班级应该有效:

def odd
  return enum_for(:odd) unless block_given?
  each do |k, v|
    if k.respond_to?(:odd?) && k.odd?
      yield k, v
    end
  end
end

第一行是非常标准的做法,如果没有将块传递给您的方法,则允许您返回枚举器,就像each那样。它可以实现以下目标:

hash.odd.select { ... }

答案 1 :(得分:0)

我相信这样的事情:

class SpecificHash < Hash
  def odd
    each do |k, v|
      yield(k, v) if k.odd?
    end
  end
end

答案 2 :(得分:0)

我没有看到为您的用例定义类的目的。单个枚举器实例似乎足以满足您的目的。

sh = (1..20).lazy
sh.map{|k| [k, "value #{k}"]}.to_h # => ...
sh.each{|k| puts k} # => ...
sh.select(&:odd?).each{|k| puts k} # => ...