2012-12-09 51 views
1

更新:下面的答案是由我简单.merge是需要的。如何在红宝石中创建散列哈希

我需要散列散列作为我的build_virtual_boards_hash方法的输出 我无法弄清楚如何将散列添加到一堆散列。或者甚至如何创建这样的事情......首先,我将列出方法,然后显示我得到的输出。

这里是用来...问题所在“build_virtual_boards_hash”中的两个方法...

def build_virtual_boards_hash(board, player) 
    virtual_board = board.dup 

    virtual_board_hash = {} 
    new_board_hash = {} 

    empty_spaces_on_board = virtual_board.grid.select{ |k, v| v == " " }.keys 
    index_mark = 'VB'+empty_spaces_on_board.length.to_s 

    #THIS IS WHERE I THINK THE PROBLEM IS 
    #HOW DO I ADD EACH LOOP RESULT TO -SOMETHING- 
    #THAT CAN BE CALLED ON LATER AFTER THE LOOP ENDS 
    #SO I GET THE DESIRED RESULTING OUTPUT? 
    # 
    empty_spaces_on_board.each do |empty_space_symbol| 
    # create a hash 
    new_board_hash = {index_mark => move_as_somebody(board, player, empty_space_symbol).grid} #value 
    p new_board_hash 
    end 

end 


#takes board....returns new board 
def move_as_somebody(board, player, empty_space) 
    new_board = board 
    if player == 'X' 
    new_board.grid[empty_space] = player 
    else 
    player == 'O' 
    new_board.grid[empty_space] = player 
    end 
    return new_board 
end 

我目前得到这两种方法这个输出...

{"VB7"=>{:a1=>"X", :a2=>"X", :a3=>" ", :b1=>" ", :b2=>"O", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>" "}} 
{"VB7"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>" ", :b2=>"O", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>" "}} 
{"VB7"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>" "}} 
{"VB7"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>"X", :c1=>" ", :c2=>" ", :c3=>" "}} 
{"VB7"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>"X", :c1=>"X", :c2=>" ", :c3=>" "}} 
{"VB7"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>"X", :c1=>"X", :c2=>"X", :c3=>" "}} 
{"VB7"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>"X", :c1=>"X", :c2=>"X", :c3=>"X"}} 

我需要的是什么...

virtual_boards = { 
    {"VB7"=>{:a1=>"X", :a2=>"X", :a3=>" ", :b1=>" ", :b2=>"O", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>" "}}, 
    {"VB6"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>" ", :b2=>"O", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>" "}}, 
    {"VB5"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>" "}}, 
    {"VB4"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>"X", :c1=>" ", :c2=>" ", :c3=>" "}}, 
    {"VB3"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>"X", :c1=>"X", :c2=>" ", :c3=>" "}}, 
    {"VB2"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>"X", :c1=>"X", :c2=>"X", :c3=>" "}}, 
    {"VB1"=>{:a1=>"X", :a2=>"X", :a3=>"X", :b1=>"X", :b2=>"O", :b3=>"X", :c1=>"X", :c2=>"X", :c3=>"X"}} 
} 

如何做到这一点?

+4

这不是一个有效的散列。你想要一个数组吗? –

+0

这是一个功课问题吗? –

+0

不,它不是一个家庭作业问题...我只是一个小菜单 – babykosh

回答

4

散列哈希的问题通常是如何初始化深度哈希。

此问题已得到解决已经并投入Ruby Facetes

h = Hash.autonew 

现在你可以很容易初始化哈希以这种方式:

h[:h1][:key] = 'value' 
h[:h2][:key] = 'value' 
... 
+1

或者避开另一个库并初始化哈希: 'hash = Hash.new {| h,k | h [k] = Hash.new(&h.default_proc)}' – davidcelis

+0

@davidcelis所以我真的把它放在这里?你是说这个virtual_board_hash = {index_mark.to_sym => new_board_hash} ...变成了这个...... virtual_board_hash = Hash.new {| h,k | h [k] = Hash.new(&h.default_proc)} – babykosh

+0

抱歉的孩子们......这不是答案。 – babykosh

1

,答案是....

#builds hash of hash of fake boards 
def build_virtual_boards_hash(board, player) 
    virtual_board = board.dup 
    i = 0 
    virtual_board_hash = {} 
    new_board_hash = {} 

    empty_spaces_on_board = virtual_board.grid.select{ |k, v| v == " " }.keys 


    while i < empty_spaces_on_board.length do 
    p empty_space_symbol = empty_spaces_on_board[i] 
    p index_mark = 'VB'+i.to_s 

    new_board_hash = {index_mark => move_as_somebody(board, player, empty_space_symbol).grid} 

    virtual_board_hash = virtual_board_hash.merge(new_board_hash)   

    i += 1 
    end 
    p virtual_board_hash 
end