ruby - 使用 Hash#dig 或 Lonely operator(&.) 安全地为嵌套哈希赋值

标签 ruby hash dig ruby-2.3 safe-navigation-operator

h = {
  data: {
    user: {
      value: "John Doe" 
    }
  }
}

要为嵌套哈希赋值,我们可以使用

h[:data][:user][:value] = "Bob"

但是如果中间的任何部分缺失,就会导致错误。

有点像

h.dig(:data, :user, :value) = "Bob"

不会工作,因为还没有可用的 Hash#dig=

要安全地赋值,我们可以做

h.dig(:data, :user)&.[]=(:value, "Bob")    # or equivalently
h.dig(:data, :user)&.store(:value, "Bob")

但是有更好的方法吗?

最佳答案

它并非没有警告(如果您从其他地方接收哈希则不起作用),但一个常见的解决方案是:

hash = Hash.new {|h,k| h[k] = h.class.new(&h.default_proc) }

hash[:data][:user][:value] = "Bob"
p hash
# => { :data => { :user => { :value => "Bob" } } }

关于ruby - 使用 Hash#dig 或 Lonely operator(&.) 安全地为嵌套哈希赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34620469/

相关文章:

ruby-on-rails - 你能检查 ruby​​ on rails 中同一行的多个值是否相同吗?

java - 什么是 Java 8 中字符串键的替代哈希?

algorithm - 哈希表 vs 平衡二叉树

networking - 确定某个挖掘答案是否权威

dns - 查找用于子域的 NS?

ruby - class_eval 和公开课

ruby - 如何配置 Bundler/Gemfile 以在开发期间使用不同的 gem 源?

ruby - ERB 中 ".each do |x|"的循环 Controller

perl - 为什么有些哈希值使用大括号初始化,有些哈希值使用圆括号初始化?

macos - Bash,批量转换IP地址