Issue #5531 has been updated by Thomas Sawyer.
Probably best to use #[] internally too.
class Hash
def [](*keys)
keys.inject(self) {|container, key| value = container[key]; value ? value : return value}
end
end
@Alexey you may have a point. But I suspect it would need to be conditioned off of responding to #to_h or #to_hash instead of using `is_a?(Hash)`.
----------------------------------------
Feature #5531: deep_value for dealing with nested hashes
http://redmine.ruby-lang.org/issues/5531
Author: Kyle Peyton
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
This feature request stems from dealing with nested hashes, like the params from a request often dealt with in web frameworks.
Conditional code often needs to be written with multiple logical ANDs in order to achieve what this simple function can:
class Hash
def deep_value(*ks)
if ks.size == 1
return self[ks.shift]
else
val = ks.shift
return (self[val].is_a?(Hash) ? self[val].deep_value(*ks) : nil)
end
end
alias dv deep_value
end
deep_value (dv) will simply recurse over a hash given a set of indexes and return the value at the end.
Example:
> foo = {:bar => {:baz => 'blah'}}
> foo.dv(:bar, :baz)
-> 'blah'
> foo.dv(:cats)
-> nil
--
http://redmine.ruby-lang.org