我一直在制作国际象棋游戏,我需要一些哈希的帮助。具体来说,如何使用迭代器“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
,但由于“+”符号而出现语法错误。
答案 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}}一样。