Ruby dig set - 使用 Hash#dig 分配值

spa*_*kle 6 ruby

基本上我想使用 #dig.

我的必须是这样的:

hash = {
   :first => {
      :second => [1,2,3,4]
  }
}
Run Code Online (Sandbox Code Playgroud)

我会用 Hash#dig

hash.dig(:first, :second) = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

我怎样才能分配这个值?

fph*_*ipe 6

您可以创建一个行为像您想要的哈希。Hash.new接受一个在键查找失败时调用的块。发生这种情况时,我们可以创建一个空哈希:

hash = Hash.new { |hash, key| hash[key] = Hash.new(&hash.default_proc) }

hash[:first][:second] = [1, 2, 3, 4]

hash # => {:first=>{:second=>[1, 2, 3, 4]}}
Run Code Online (Sandbox Code Playgroud)

请注意,仅访问不存在的密钥将导致创建新的哈希:

hash.dig(:a, :b, :c) # => {}

hash # => {:first=>{:second=>[1, 2, 3, 4]}, :a=>{:b=>{:c=>{}}}}

hash[:foo].nil? # => false
Run Code Online (Sandbox Code Playgroud)

  • `Hash.new { |h,k| h[k] = Hash.new(&h.default_proc) }` 允许您无限期地定义嵌套键,而不仅仅是在前 2 个级别 (2认同)
  • 将默认过程附加到哈希会产生必须认识到的后果。例如,无法执行“hash[:cat].nil?”来确定 hash 是否有键“:cat”,因为“hash[:cat] #=> {}”。(当然,可以使用 `hash.key?(:cat) #=> false`,无论如何,这是一种很好的做法。)。另一个例子是 `hash[:fisrt][:second] == [1,2,3,4] #=> false`,掩盖了我拼写错误 `:first` 的事实。如果没有默认过程,就会引发异常。我的偏好是在构造哈希后避免使用默认过程,但当然不能简单地删除它。 (2认同)

Uel*_*elb 5

dig 不能用于为哈希分配值,此方法仅用于访问值。

对于您的情况,您可以执行以下两件事之一:

hash = { first: { second: [1, 2, 3, 4] } }
Run Code Online (Sandbox Code Playgroud)

或者 :

hash[:first] = { second: [1, 2, 3, 4] }
Run Code Online (Sandbox Code Playgroud)

您还可以使用该文章中的方法:How to setdynamic value of Nested key in Ruby hash

他们创建了一种新的哈希方法来动态地将嵌套值分配给哈希。