Ruby中是否存在类似.dig的深层哈希赋值方法?
Ruby嵌套哈希深层键的简洁赋值方法
你可以通过以下几种更简洁的方式实现嵌套哈希深层键的赋值,避免重复的存在性判断:
方法一:利用||=链式赋值
这是最直观的写法,借助||=操作符(当左侧值为nil或false时赋值),逐层确保上级哈希存在:
some_hash = {} (some_hash['a'] ||= {})['b'] ||= {} some_hash['a']['b']['c'] = 'some value'
如果上级键可能存在但值为false,可以改用fetch方法明确指定默认值:
some_hash = {} some_hash.fetch('a', {})['b'] ||= {} some_hash['a']['b']['c'] = 'some value'
方法二:自定义哈希方法
如果需要频繁进行这类操作,可以给Hash类添加一个自定义方法,实现类似dig的赋值逻辑:
class Hash def dig_set(*keys, value) # 只剩最后一个键时直接赋值 return self[keys.first] = value if keys.size == 1 # 取出当前键,不存在则初始化为空哈希 current_key = keys.shift self[current_key] ||= {} # 递归处理剩余键 self[current_key].dig_set(*keys, value) end end # 使用示例 some_hash = {} some_hash.dig_set('a', 'b', 'c', 'some value') puts some_hash # => {"a"=>{"b"=>{"c"=>"some value"}}}
方法三:使用Hash#deep_merge(适用于批量赋值)
如果是批量设置深层键值对,可以用deep_merge方法(Ruby on Rails框架自带,纯Ruby环境可自行实现):
# 纯Ruby环境实现deep_merge class Hash def deep_merge(other_hash) merge(other_hash) do |key, old_val, new_val| old_val.is_a?(Hash) && new_val.is_a?(Hash) ? old_val.deep_merge(new_val) : new_val end end end # 使用示例 some_hash = {} some_hash.deep_merge!('a' => {'b' => {'c' => 'some value'}}) puts some_hash # => {"a"=>{"b"=>{"c"=>"some value"}}}
内容的提问来源于stack exchange,提问作者CafeHey
相关产品推荐
相关产品推荐

