在Rails中,我正在尝试使用哈希。当我对其进行each
时,我会得到意想不到的结果。我正在尝试访问每个元素的“名称”。
我从一个名为some_files
的哈希开始,这次只有一个元素:
logger.debug some_files
# Outputs this: {"0"=>{"name"=>"index.html", "contents"=>""}}
# Ok cool, the first level of this array seems to only have 1 element called "0".
现在我想迭代它(因为有时候它会有超过1个元素)。
some_files do |some_file|
logger.debug some_file
# Outputs this: ["0", {"name"=>"index.html", "contents"=>""}]
# Weird, why do I get "0" still? And why does it appear to be a separate element?
logger.debug some_file.name
# Outputs an error: NoMethodError (undefined method `name' for ["0", {"name"=>"index.html", "contents"=>""}]:Array):
end
答案 0 :(得分:3)
如果在Ruby中使用.each迭代Hash,两者,键和值都会传递给Block。如果仅指定1个参数,则这将是包含键和值的Array。因此,正确使用将是:
hash = {"0"=>{"name"=>"index.html", "contents"=>""}}
hash.each do |key, value|
puts "key = #{key}, value = #{value}"
# => key = 0, value = {"name"=>"index.html", "contents"=>""}
end
由于value
也是一个哈希,你可以用同样的方式迭代它。
答案 1 :(得分:1)
第一个输出:
{"0"=>{"name"=>"index.html", "contents"=>""}}
是哈希,而不是数组。你的第二个输出是一个数组。
some_files.each do |some_file|
# you get
a = ["0", {"name"=>"index.html", "contents"=>""}]
# which is an array, containing a string and a hash and you could get the name via:
name = a[1]["name"]
end
您得到undefined method name
,因为该数组没有方法名称。
至于
很奇怪,为什么我仍然会“0”?为什么它似乎是一个单独的元素?
我不明白你的意思。