我想要一个以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
的键?
答案 0 :(得分:5)
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
这会为你创建一个完整的哈希。