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

时间:2016-02-03 09:38:55

标签: ruby hash

我想要一个以1到18的整数作为键的哈希。我希望哈希看起来像这样:

myHash = Hash.new
myHash[1] = "free"
myHash[2] = "free"
...
myHash[18] = "free"

我想知道是否有更好的方法来执行此操作,例如使用for循环。会是这样的:

myHash = Hash.new
for i in 1..18
myHash[i] = "free"

工作,还是只创建18个名为i的键?

7 个答案:

答案 0 :(得分:5)

for loops很少使用。我建议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"}

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

hash = (1..18).each_with_object({}) { |i, h| h[i] = 'free' }

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

另一种选择是使用map

hash = (1..18).map { |i| [i, 'free'] }.to_h

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

答案 1 :(得分:3)

您的哈希称为myHash,而不是哈希。然后,在Ruby中我们使用每个,而不是。你的变量应该是my_hash,而不是myHash。此外,您错过了for的结束关键字。所以:

my_hash = Hash.new
(1..18).each { |index| my_hash[index] = "free" }

答案 2 :(得分:2)

这是一个超快速的单行程序,不需要您手动循环,使用计数初始化数组会将数组的大小设置为此,并将块应用于每个索引。然后Hash[]将获取数组(数组)并将其转换为哈希。 i将基于零,因此您需要使用i+1

my_hash = Hash[Array.new(18) { |i| [i+1, "free"] }] # Pure Ruby
my_hash = Array.new(18) { |i| [i+1, "free"] }.to_hash # Only works in Rails
my_hash = Array.new(18) { |i| [i+1, "free"] }.to_h # Only works in Ruby 2.3

答案 3 :(得分:1)

myHash = Hash.new
for i in 1..18
myhash[i] = "free"

好吧,跑吧。它会导致错误:syntax error, unexpected end-of-input, expecting keyword_end。啊,是的,缺少end。让我们添加缩进,这样我们就可以看到循环中的内容和不循环的内容。

myHash = Hash.new
for i in 1..18
  myhash[i] = "free"
end

另一个错误:in 'block in <main>': undefined local variable or method 'myhash' for main:Object (NameError)。 Ruby说它不知道myhash。愚蠢的Ruby。 myhash是哈希,我们在第一行说了。哦等等......我们将其命名为myHash,而不是myhash

myHash = Hash.new
for i in 1..18
  myHash[i] = "free"
end

运行它:没有错误,根本没有输出。添加一行以检查myHash

myHash = Hash.new
for i in 1..18
  myHash[i] = "free"
end
p myHash

就是,myHash:{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"}

答案 4 :(得分:0)

我不确定你到底想要做什么,但我在Hash文档中找到了一个方法(ruby-doc.org/core-2.2.0/Hash.html)在这里可能会有所帮助。

看起来你正试图让哈希返回字符串“#free;&#39;当你还没有定义一个值时。

如您所知,当您在哈希中调用尚未定义的键时,它将返回nil:

h = {:foo => bar}
h[:baz]
# nil

您可以使用#default

更改未知密钥的默认结果
h = {1 => 'Cat', 2 => 'Dog'}
h.default = 'Free'
h[1]
# 'Cat'
h[4]
# 'Free'

答案 5 :(得分:0)

还有一种方法:

([*1..18].product ["free"]).to_h

答案 6 :(得分:-2)

是。这是可能的,但你的问题没有意义。你必须有一些数组如下。有许多先进的解决方案。但对于初学者,我会给你这个解决方案。

a =["first","second","third",......]
h = Hash.new
a.each_with_index do |value,index|
  h.merge{index => value}
end

这会为你创建一个完整的哈希。