加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何使用命名索引(键)数组在嵌套哈希中设置值?

发布时间:2020-12-17 02:55:06 所属栏目:百科 来源:网络整理
导读:给定任何嵌套哈希,例如: { canada: { ontario: { ottawa: :me},manitoba: { winnipeg: nil}},united_states: { district_of_coloumbia: { washington: nil}}} 如何使用任何数组键[:canada,:ontario,:ottawa]或[:united_states,:district_of_columbia,
给定任何嵌套哈希,例如:

{ canada: 
  { ontario: 
    { ottawa: :me},manitoba: 
    { winnipeg: nil}},united_states: 
  { district_of_coloumbia: 
    { washington: nil}}}

如何使用任何数组键[:canada,:ontario,:ottawa]或[:united_states,:district_of_columbia,:washington]来获取或设置值.

基本上,我的问题是如何将[:canada,:ottawa]更改为格式hash [:canada] [:ontario] [:ottawa]的getter或setter,当我不知道它的长度时键数组.

所以我可以这样做:

hash[:canada][:ontario][:ottawa] = nil
hash[:canada][:manitoba][:winnipeg] = :me

我使用递归制作了一个getter:

def reindex(h,index_array)
  i = index_array.shift
  result = index_array.empty? ? h[i] : reindex(h[i],index_array)
  result
end

但是我觉得我在想这个,应该有一个更简单的方法.

解决方法

更简单的方法(在我看来)是连续访问元素:[]:

keys = [:canada,:ontario,:ottawa]
hash = { canada: { ontario: { ottawa: :me},manitoba: { winnipeg: nil} },united_states: { district_of_coloumbia: { washington: nil } } }

# get
p keys.inject(hash) { |h,k| h.public_send(:[],k) }
#=> :me

# set
last = keys[0..-2].inject(hash) { |h,k) }
last.public_send(:[]=,keys[-1],'other')
p hash #=> {:canada=>{:ontario=>{:ottawa=>"other"},:manitoba=>{:winnipeg=>nil}},:united_states=>{:district_of_coloumbia=>{:washington=>nil}}}

包含在方法中:

def get_by_keys(hash,keys)
  keys.inject(hash) { |h,k) }
end

def set_by_keys(hash,keys,v)
  last = keys[0..-2].inject(hash) { |h,k) }
  last.public_send(:[]=,v)
  hash
end

keys = [:canada,united_states: { district_of_coloumbia: { washington: nil } } }

p get_by_keys(hash,keys) #=> :me
p set_by_keys(hash,'other') #=> {:canada=>{:ontario=>{:ottawa=>"other"},:united_states=>{:district_of_coloumbia=>{:washington=>nil}}}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读