是否可以在Ruby哈希中使用并行分配键?

时间:2017-09-19 14:16:13

标签: ruby-on-rails ruby hash multiple-assignment

鉴于它是一个不可变对象,ruby允许并行分配如下:

sample[:alpha] = sample[:beta] = sample[:gamma] = 0

但还有其他简单的方法吗? ,像:

sample[alpha:, beta:, gamma: => 0]

或:

sample[:alpha, :beta, :gamma] => 0, 0, 0 

3 个答案:

答案 0 :(得分:3)

首先,这不能按预期工作:

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}

答案 1 :(得分:1)

这个怎么样?

sample.merge!(alpha: 0, beta: 0, gamma: 0)

答案 2 :(得分:0)

没有类似于你所描述的东西,但是你可以运行一个包含所有的循环并分配值。

keys = [:alpha, :beta, :gamma, :theta, ...]
keys.each {|key| sample[key] = 0}

减少额外击键次数,并且很容易更改键阵列。