代码之家  ›  专栏  ›  技术社区  ›  user3743556

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

  •  1
  • user3743556  · 技术社区  · 11 年前

    我一直在下棋,我需要一些哈希的帮助。具体来说,如何使用迭代器“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 回复  |  直到 11 年前
        1
  •  3
  •   Mark Silverberg    11 年前

    你想让钥匙成为一个符号吗?

    你可以的 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}"

        2
  •  0
  •   the Tin Man    11 年前

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

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

    你可以避免使用 i + 1 如果您想玩DRY游戏,可以将其分配给一个中间变量:

    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"}
    

    在Ruby中,我们使用snake_case代替camelCase作为变量和方法名。类和模块获得camelCase。

    此外,思考这些问题:

    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非常喜欢一次完成所有任务 times 方法是迭代器。 map 可以对其进行迭代,并将返回每次迭代的块值。 to_h 是Ruby中一种更现代的将数组转换为哈希的方法,就像使用 Hash[...] .