我有一个处理对象哈希的问题。我的哈希是玩家名称,对象也有一个属性@name
。
我正在尝试迭代多个玩家,并能够使用他们的方法等相当干净的代码。以下是我创建哈希的方法:
puts "Who all is playing?"
gets.split.each do |p|
players[p] = Player.new(p)
end
然后我想像这样迭代这些玩家,但它不起作用。
players.each_key do |p_name, obj|
puts obj.name + " turn"
然而,此确实有效:
players.each_key do |p_name, obj|
puts players[p_name].name + " turn"
在第一次尝试时,我得到一个obj为零的错误。有人可以解释为什么这不起作用,以及如何以我想要的方式做到这一点?
谢谢!
P.S。我所做的数组或哈希的正确术语是什么?我来自PHP,所以我认为它是一个数组(带有哈希),但从技术上讲它不是Ruby中的数组?
答案 0 :(得分:3)
您想使用each_pair
而非each_key
。方法each_key
仅为块提供一个参数,这是关键。因此,obj
仍未绑定。另一方面,each_pair
为您提供密钥和相应的值。
答案 1 :(得分:3)
P.S。我所做的数组或哈希的正确术语是什么?我来自PHP,所以我认为它是一个数组(带有哈希),但从技术上讲它不是Ruby中的数组?
它在Ruby中被称为Hash,它与数组不同。哈希是用:
创建的my_hash = Hash.new
或
my_hash = {}
这样就完成了数组:
my_array = Array.new
或
my_array = []
Ruby哈希是associative arrays,就像PHP中的“数组”一样。 Ruby数组更像传统的“C”数组,因为它们用整数索引。