module Spruz::Subhash
Public Instance Methods
subhash(*patterns) { |k, v, $~| ... }
click to toggle source
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.
# File lib/spruz/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