Feature #18617
Updated by hsbt (Hiroshi SHIBATA) over 2 years ago
# Abstract Since is very common the hash nested hashes, expecialy in the API world, I whold love to use Hash#[] syntax as alias for Hash#dig. # Background Since a start to learn ruby, Hashes are the most powerful structure I can use to build API. It's intuitive and concise way to represent data. But something always make me unconfortable, the excess of square brackets([]) to access nested data. Everytime is a "nasty", to access things like ``` ruby purchase[:customer][:addresses][:delivery][:street] ``` even worse when data is missing anypoint. So, I meet the Hash#dig. Wonderful, easy, and powerful as well. But .dig is not so intuitive, and I think, why not use the most common way to access data with multiple keys. Why not use the most powerful method, with all powerfulness. Why limitate Hash#[] to one single param. :( # Proposal So, my proposal is to allow Hash#[] to take undefinily params, and act like .dig, more concise to access nested data, more powerful, more happy :D. **Stop:** ``` ruby hash[:a][:b][:c][:d][:e][:f][:u] ``` **Just:** ``` ruby hash[:a, hsh[:a, :b, :c, :d, :e, :lov, :u] ``` # Implementation Since Hash#[] and Hash.dig, both calling Hash::new when key is not found, just check the arity for performance. Currently, I use something like: ``` ruby module AwesoneAccess def [] *keys if keys.many? dig *keys else super end end end class Hash prepend AwesoneAccess end a = {foo: {bar: :baz}} # => { foo: { bar: :baz } a[:foo][:bar] == a[:foo, :bar] # => true ``` # Evaluation It'll be awesome. (ノ◕ヮ◕)ノ*:・゚✧ ✧゚・: *ヽ(◕ヮ◕ヽ) # Discussion I would love listen you guys. Sincerely...ಥ_ಥ # Summary Faces by [[textfac.es]] ?!