1

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

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

但是还有其他简单的方法可以做到这一点吗?, 就像是 :

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

或者:

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

3 回答 3

4

首先,这不像您期望的那样工作:

sample = {}
sample[:alpha], sample[:beta], sample[:gamma] = 0

这将导致:

sample == { alpha: 0, beta: nil, gamma: nil }

要获得所需的结果,您可以改用并行分配

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

或者,遍历键以分别分配每个键:

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

或者,原始哈希与您的新属性合并:

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

根据您在此处实际尝试执行的操作,您可能希望考虑为您的散列设置一个默认值。例如:

sample = Hash.new(0)

puts sample[:alpha] # => 0
sample[:beta] += 1  # Valid since this defaults to 0, not nil

puts sample         # => {:beta=>1}
于 2017-09-19T14:22:04.790 回答
1

这个如何?

sample.merge!(alpha: 0, beta: 0, gamma: 0)
于 2017-09-19T14:21:47.123 回答
0

没有什么像你所描述的那样,但你可以运行一个循环并分配值。

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

减少了额外的击键次数,并且非常容易更改键数组。

于 2017-09-19T14:24:08.813 回答