Module: Tins::Subhash

Included in:
Hash
Defined in:
lib/tins/subhash.rb

Instance Method Summary collapse

Instance Method Details

#subhash(*patterns) ⇒ Object

Create a subhash from this hash, that only contains key-value pairs matching patterns and return it. patterns can be for example /^foo/ to put ‘foobar’ and ‘foobaz’ or ‘foo’/:foo to put ‘foo’ into the subhash.

If a block is given this method yields to it after the first pattern matched with a 3-tuple of (key, value, match_data) using the return value of the block as the value of the result hash. match_data is a MatchData instance if the matching pattern was a regular rexpression otherwise it is nil.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/tins/subhash.rb', line 12

def subhash(*patterns)
  patterns.map! do |pat|
    pat = pat.to_sym.to_s if pat.respond_to?(:to_sym)
    pat.respond_to?(:match) ? pat : pat.to_s
  end
  result =
    if default_proc
      self.class.new(&default_proc)
    else
      self.class.new(default)
    end
  if block_given?
    each do |k, v|
      patterns.each { |pat|
        if pat === k.to_s
          result[k] = yield(k, v, $~)
          break
        end
      }
    end
  else
    each do |k, v|
      result[k] = v if patterns.any? { |pat| pat === k.to_s }
    end
  end
  result
end