如何从哈希中获取数据?

时间:2009-08-24 20:01:45

标签: ruby-on-rails ruby

考虑到这个哈希:params

"positions"=>{
    "1"=>{"x"=>"50", "y"=>"30"}, 
    "2"=>{"x"=>"22", "y"=>"53"}, 
    "3"=>{"x"=>"68", "y"=>"35"}
 }

我该怎么做? (不起作用,但试图表明我想做什么)

params[:positions].each do |position|
  logger.info(position.x)
end

我知道,痛苦的初学者......

我得到NoMethodError (undefined method 'x' for ["1", {"x"=>"50", "y"=>"30"}]:Array)

4 个答案:

答案 0 :(得分:13)

我认为你想要的是

params[:positions].each do |index, coords|
  logger.info(coords['x'])
end

如果您不关心索引,也可以使用params[:positions].values.each do |coords|代替。

答案 1 :(得分:3)

你可以这样做:

positions = {
  "1"=>{"x"=>"50", "y"=>"30"},
  "2"=>{"x"=>"22", "y"=>"53"},
  "3"=>{"x"=>"68", "y"=>"35"}
}

positions.each_value do |hash|
  logger.info(hash['x'])
end

each_value方法将拉出哈希值(例如{"x"=>"50", "y"=>"30"})。在这些哈希中,您的键是字符串,因此您需要使用弦键查看这些哈希值。

答案 2 :(得分:1)

我认为你正在寻找位置[x]而不是position.x。

答案 3 :(得分:0)

如果你使用带有哈希的Enumerable#each,你需要捕获两个块变量(这将键/值数组“展开”为两个不同的变量)。此外,Ruby不使用点语法进行哈希(这不是Javascript)。

 some_hash.each do | (key, value)
    puts value["x"]
 end

这样可以避免首先组装一个值数组(使用Hash#values)。