在哈希上使用每个时出错

时间:2014-02-26 08:56:40

标签: ruby-on-rails ruby

在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

2 个答案:

答案 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”?为什么它似乎是一个单独的元素?

我不明白你的意思。