我是红宝石领域的新手,在使用hashes时遇到了很多困难。在Ruby中似乎有很多方法来做同样的事情,但是我遇到的问题是在现有哈希的子级别上分配散列。
例如,在我的类中,我有以下代码:

@query_hash = {"term" => {"field" => "value"}
@main_hash["query"]["filtered"]["query"]["bool"] = @query_hash

问题是有时@main_hash中缺少一个子散列,所以上面的路径会有一个键,比如"filtered"中缺少"query"@main_hash,我会得到一个与nil相关的异常所以我要做的是,当我深入到散列中时,首先检查每一层嵌套,然后再引用下一层。如果这个级别不存在,我必须以这样一个丑陋的方式初始化那个子哈希:@main_hash["query"] = {"filtered" => {"query" => "bool"}}
有没有更干净和更简单的方法来处理这种杂碎咀嚼?

最佳答案

这仅仅是对@Ryan Bigg答案的概括。
假设:

main_hash   = { "query1"=>
                 { "filtered"=>
                   { "query2"=>"value" }
                 }
              }
nested_keys = ["query1", "filtered", "cat", "dog"]
query_hash  = { "term"=>
                { "field"=>"value" }
              }

然后:
nested_keys.reduce(main_hash) { |h,k|
  h[k].is_a?(Hash) ? h[k] : h[k] = {} }.update(query_hash)
main_hash
  #=> { "query1"=>
  #     { "filtered"=>
  #       { "query2"=> "value",
  #         "cat"=>
  #           { "dog"=>
  #             {"term"=>
  #               {"field"=>"value"}
  #             }
  #           }
  #       }
  #     }
  #   }

注意h[k].is_a?(Hash)提供双重任务:它检查h是否有一个键k,如果有,则检查h[k]是否是散列。

10-06 10:28