如何自动在哈希中命名符号?

时间:2014-08-11 21:12:25

标签: ruby hash syntax symbols

我一直在制作国际象棋游戏,我需要一些哈希的帮助。具体来说,如何使用迭代器“i”

自动命名哈希表符号
8.times do |i = 0, x = 0|
  i += 1
  x += 1
  pawnHash[:P] = "P#{i}",Pawn.new(x,2,"P#{i}","black")
end
puts pawnHash

符号应如下所示: :P1。但似乎不可能使用变量'i'命名哈希

全套8个符号应如下所示:: P1,:P2,:P3 ......等 我在声明键/值对时尝试执行:P + i,但由于“+”符号而出现语法错误。

2 个答案:

答案 0 :(得分:3)

您是否尝试将密钥设为符号?

您可以执行hash["P#{i}".to_sym]

2.0.0-p247 :016 > i = 2
 => 2 
2.0.0-p247 :017 > h = {}
 => {} 
2.0.0-p247 :018 > h["P#{i}".to_sym] = "value"
 => "value" 
2.0.0-p247 :019 > h
 => {:P2=>"value"} 
2.0.0-p247 :020 > h.keys.first.class
 => Symbol 

或者你可以:"P#{i}"

答案 1 :(得分:0)

您可以简化循环并使其更像Ruby:

pawn_hash = {}
8.times { |i| pawn_hash["P#{ i + 1 }".to_sym] = "P#{ i + 1}" }
pawn_hash 
# => {:P1=>"P1",
#     [...]
#     :P8=>"P8"}

如果您想玩DRY游戏,可以通过将i + 1分配给中间变量来避免使用pawn_hash = {} 8.times do |i| c = i + 1 pawn_hash["P#{ c }".to_sym] = "P#{ c }" end pawn_hash # => {:P1=>"P1", # [...] # :P8=>"P8"}

pawn_hash = {}
1.upto(8) { |i| pawn_hash["P#{ i }".to_sym] = "P#{ i }" }
pawn_hash 
# => {:P1=>"P1",
#     [...]
#     :P8=>"P8"}

或者,使用不同的循环:

pawn_hash = 8.times.map { |i| ["P#{ i + 1 }".to_sym, "P#{ i + 1}"] }.to_h
# => {:P1=>"P1",
#     :P2=>"P2",
#     :P3=>"P3",
#     :P4=>"P4",
#     :P5=>"P5",
#     :P6=>"P6",
#     :P7=>"P7",
#     :P8=>"P8"}

pawn_hash = Hash[8.times.map { |i| ["P#{ i + 1 }".to_sym, "P#{ i + 1}"] }]
# => {:P1=>"P1",
#     :P2=>"P2",
#     :P3=>"P3",
#     :P4=>"P4",
#     :P5=>"P5",
#     :P6=>"P6",
#     :P7=>"P7",
#     :P8=>"P8"}
#     :P8=>"P8"}

在Ruby中,我们使用snake_case而不是camelCase来表示变量和方法名称。类和模块得到了camelCase。

另外,冥想这些:

times

没有必要循环并分配给哈希。相反,它就像Ruby一样在一次通过中完成所有操作。 map方法是一个迭代器。 to_h可以迭代它,并将返回每次迭代的块值。 Hash[...]是Ruby中一种更现代的方式,可以将数组转换为哈希,就像使用{{1}}一样。