是否可以使用`for`循环填充哈希?

S C*_*aig -2 ruby hash

我想要一个哈希值,该值包含从1到18的整数作为键。我希望哈希看起来像这样:

myHash = Hash.new
myHash[1] = "free"
myHash[2] = "free"
...
myHash[18] = "free"
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法可以做到这一点,例如使用for循环。将类似:

myHash = Hash.new
for i in 1..18
myHash[i] = "free"
Run Code Online (Sandbox Code Playgroud)

工作,还是只创建18个称为i

Ste*_*fan 5

for循环很少使用。我建议each

hash = {}
(1..18).each { |i| hash[i] = 'free' }
hash
#=> { 1=>"free",  2=>"free",  3=>"free",  4=>"free",  5=>"free",  6=>"free",
#     7=>"free",  8=>"free",  9=>"free", 10=>"free", 11=>"free", 12=>"free",
#    13=>"free", 14=>"free", 15=>"free", 16=>"free", 17=>"free", 18=>"free"}
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令将初始对象(即空哈希)传递到循环中each_with_object

hash = (1..18).each_with_object({}) { |i, h| h[i] = 'free' }
Run Code Online (Sandbox Code Playgroud)

在该块内,第二个参数h引用传入的哈希,因此可以对其进行修改。最后,each_with_object返回填充的哈希。

另一种选择是使用map

hash = (1..18).map { |i| [i, 'free'] }.to_h
Run Code Online (Sandbox Code Playgroud)

这将构建一个中间数组[[1, 'free'], [2, 'free'], ...],然后使用将其转换为哈希Array#to_h