You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:11:00