From: Alexey Muranov Date: 2011-11-01T21:45:17+09:00 Subject: [ruby-core:40624] [ruby-trunk - Feature #5531] deep_value for dealing with nested hashes Issue #5531 has been updated by Alexey Muranov. I can think of the following questions/objections to the suggested method definition: 1. is `{ 1 => 2}.dv(1,1) # => nil` the desired result? 2. this method examines the (super)class name of an object, rather than the behavior of an object, so does not allow to mix nested hashes and arrays, 3. this method calls itself recursively, while a loop would suffice. The following is not a serious suggestion, but seriously, how about: class Object def deep_value(*keys) obj = self obj = obj[keys.shift] while !keys.empty? && obj.respond_to?(:[]) return obj end end (For this to work well it will be important to call it #deep_value and not to redefine #[].) ---------------------------------------- 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