Feature #19699
closedNeed a way to store values like dig
Description
Currently, there is no way to perform a .store
operation on nested hashes in Ruby as there is for accessing them using .dig
, so I would like to propose something like:
Hash#dig_store(*args, **kwargs, arg = nil), which fills the value at *args with **kwargs if the value at *args is a hash, or with arg if the value is something else. Here are some examples:
a = {}
a.dig_store(:a, :b, :c, :d, 10)
=> {:a=>{:b=>{:c=>{:d=>10}}}}
a = {}
a.dig_store(:a, :b, :c, :d, a: 10, b: 20, c: 30)
=> {:a=>{:b=>{:c=>{:d=>{:a=>10, :b=>20, :c=>30}}}}}
a = {a: {b: {c: "test"}}}
a.dig_store(:a, :b, :c, "123")
=> {:a=>{:b=>{:c=>"123"}}}
a = {a: {b: {c: {}}}
a.dig_store(:a, :b, :c, a: 10, b: 20)
=> {:a=>{:b=>{:c=>{:a=>10, :b=>20}}}}
I'm not that skilled on Ruby (actually a Junior developer), but i'm looking forward to implementing it if the core team approves it
Updated by edufcarvalho (Eduardo Carvalho) over 1 year ago
Currently, there is no way to perform a .store
operation on nested hashes in Ruby as there is for accessing them using .dig
, so I would like to propose something like:
Hash#dig_store(*args, **kwargs), which fills the value at *args with **kwargs if the value at *args is a hash, or with the args.last if the value is something else. Here are some examples:
a = {}
a.dig_store(:a, :b, :c, :d, 10)
=> {:a=>{:b=>{:c=>{:d=>10}}}}
a = {}
a.dig_store(:a, :b, :c, :d, a: 10, b: 20, c: 30)
=> {:a=>{:b=>{:c=>{:d=>{:a=>10, :b=>20, :c=>30}}}}}
a = {a: {b: {c: "test"}}}
a.dig_store(:a, :b, :c, "123")
=> {:a=>{:b=>{:c=>"123"}}}
a = {a: {b: {c: {}}}
a.dig_store(:a, :b, :c, a: 10, b: 20)
=> {:a=>{:b=>{:c=>{:a=>10, :b=>20}}}}
I'm not that skilled on Ruby (actually a Junior developer), but i'm looking forward to implementing it if the core team approves
Updated by byroot (Jean Boussier) over 1 year ago
- Related to Feature #14564: `dig` opposite method added
Updated by byroot (Jean Boussier) over 1 year ago
- Related to Feature #13179: Deep Hash Update Method added
Updated by byroot (Jean Boussier) over 1 year ago
- Related to Feature #11747: "bury" feature, similar to 'dig' but opposite added
Updated by byroot (Jean Boussier) over 1 year ago
- Status changed from Open to Closed
I believe this is a duplicate of [Feature #14564], [Feature #13179] and [Feature #11747].
This was previously rejected by Matz because it was lacking a use case and lacking a proper name.
I'm somewhat sympathetic to this feature request, but I don't think it really move the needle in term of proposal, so I'll close it as duplicate.
Thanks though.