我想创建一个类似于标准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
方法一样工作但只包含键/值对,其中键是奇数?
答案 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} # => ...