是否可以对 Ruby 哈希中的键使用并行赋值?
Is it possible to use parallel assignment for keys in Ruby hash?
鉴于它是一个不可变对象,ruby 允许并行赋值,如下所示:
sample[:alpha] = sample[:beta] = sample[:gamma] = 0
但是还有其他简单的方法可以做到这一点吗? , 类似 :
sample[alpha:, beta:, gamma: => 0]
或:
sample[:alpha, :beta, :gamma] => 0, 0, 0
这个怎么样?
sample.merge!(alpha: 0, beta: 0, gamma: 0)
首先,这并不像您预期的那样有效:
sample = {}
sample[:alpha], sample[:beta], sample[:gamma] = 0
这将导致:
sample == { alpha: 0, beta: nil, gamma: nil }
要获得所需的结果,您可以改用 parallel assignment:
sample[:alpha], sample[:beta], sample[:gamma] = 0, 0, 0
或者,loop through the keys分别分配每一个:
[:alpha, :beta, :gamma].each { |key| sample[key] = 0 }
或者,merge 具有新属性的原始哈希值:
sample.merge!(alpha: 0, beta: 0, gamma: 0)
根据您在这里实际尝试执行的操作,您可能希望考虑为您的散列提供一个 default value。例如:
sample = Hash.new(0)
puts sample[:alpha] # => 0
sample[:beta] += 1 # Valid since this defaults to 0, not nil
puts sample # => {:beta=>1}
没有任何东西像您所描述的那样,但是您可以 运行 一个包含所有的循环并分配值。
keys = [:alpha, :beta, :gamma, :theta, ...]
keys.each {|key| sample[key] = 0}
减少了额外的击键次数,并且非常容易更改按键数组。
鉴于它是一个不可变对象,ruby 允许并行赋值,如下所示:
sample[:alpha] = sample[:beta] = sample[:gamma] = 0
但是还有其他简单的方法可以做到这一点吗? , 类似 :
sample[alpha:, beta:, gamma: => 0]
或:
sample[:alpha, :beta, :gamma] => 0, 0, 0
这个怎么样?
sample.merge!(alpha: 0, beta: 0, gamma: 0)
首先,这并不像您预期的那样有效:
sample = {}
sample[:alpha], sample[:beta], sample[:gamma] = 0
这将导致:
sample == { alpha: 0, beta: nil, gamma: nil }
要获得所需的结果,您可以改用 parallel assignment:
sample[:alpha], sample[:beta], sample[:gamma] = 0, 0, 0
或者,loop through the keys分别分配每一个:
[:alpha, :beta, :gamma].each { |key| sample[key] = 0 }
或者,merge 具有新属性的原始哈希值:
sample.merge!(alpha: 0, beta: 0, gamma: 0)
根据您在这里实际尝试执行的操作,您可能希望考虑为您的散列提供一个 default value。例如:
sample = Hash.new(0)
puts sample[:alpha] # => 0
sample[:beta] += 1 # Valid since this defaults to 0, not nil
puts sample # => {:beta=>1}
没有任何东西像您所描述的那样,但是您可以 运行 一个包含所有的循环并分配值。
keys = [:alpha, :beta, :gamma, :theta, ...]
keys.each {|key| sample[key] = 0}
减少了额外的击键次数,并且非常容易更改按键数组。