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}}} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |