2012-03-13 56 views
0

所以,說我有一個數組,看起來像這樣:獲取收益率對數組的嵌套數組工作 - 紅寶石

t = [ 
     [ 
     [["Armando", "P"],["Dave", "S"]], 
     [["Richard", "R"],["Michael", "S"]], 
     ], 
     [ 
     [["Allen", "S"],["Omer", "P"]], 
     [["David E.", "R"], ["Richard X.", "P"]] 
     ] 
    ] 

基本上,我想,以評估有兩個元素的數組每個內部陣列 - 例如上面的代碼片段中的第一個是Armando, and Dave。這兩個元素都是一個數組中的兩個元素,這是父數組中的第一個元素。

我想要做的是取第一個「子數組」,並將其分配給一個變量。將該變量傳遞給我擁有的另一個方法(例如my_method),該方法將僅返回子數組中的其中一個元素。

我想我想使用yield但我不太確定如何做到這一點。

我的想法是這樣的:

t.each do |entry| 
    a = entry 
    yield my_method(a) 
end 

但我正在逐漸與yield的手斷和海拉複雜的陣列混淆。

我如何得到我在找的東西?

編輯1:這就是我正在做的與t,但我仍然收到一個錯誤,表明我做了錯誤的產量等。

這是我將要評估t主要方法:

def rps_game_winner(game) 
    raise WrongNumberOfPlayersError unless game.length == 2 
    if (game[0][1] =~ /[r]/i && game[1][1] =~ /[s]/i) || (game[0][1] =~ /[s]/i && game[1][1] =~ /[p]/i) || (game[0][1] =~ /[p]/i && game[1][1] =~ /[r]/i) 
     return game[0] 
    elsif (game[0][1] =~ /[r]/i && game[1][1] =~ /[p]/i) || (game[0][1] =~ /[s]/i && game[1][1] =~ /[r]/i) || (game[0][1] =~ /[p]/i && game[1][1] =~ /[s]/i) 
     return game[1] 
    elsif game[0][1] == game[1][1] 
     return game[0] 
    else 
     raise NoSuchStrategyError.new 
    end 
end 

def rps_tournament_winner(t) 
    t.each do |pair| 
    yield pair 
    end 
end 

rps_tournament_winner(t) { |x| rps_game_winner(x) } 

所以我得到的錯誤是:NoSuchStrategyError: NoSuchStrategyError - 這意味着產量傳遞一個值的塊和被傳遞到我的方法rps_game_winner,它正在評估一些東西並給出這個錯誤 - 按照這個方法。但它沒有正確評估它......因爲它應該看着ArmandoDave並返回一個贏家,那麼它應該返回並繼續查看下一對並返回贏家等。

任何想法這不起作用?

回答

1

查閱編輯下面

我不能完全確定要與產生名字做什麼,但我已經爲你準備了提取所有的名字一個例子,在使用收益,你能適應自己的需要:

t = [ 
     [ 
     [["Armando", "P"],["Dave", "S"]], 
     [["Richard", "R"],["Michael", "S"]], 
     ], 
     [ 
     [["Allen", "S"],["Omer", "P"]], 
     [["David E.", "R"], ["Richard X.", "P"]] 
     ] 
    ] 

def get_name_pairs(t)  
    t.each do |a| 
    a.each do |x| 
     yield x[0], x[1] 
    end 
    end 
end 

def print_first_names(person1, person2) 
    puts person1[0] 
    puts person2[0] 
end 

get_name_pairs(t) {|x, y| print_first_names(x, y)} 

編輯

現在,OP澄清的問題,這裏是修復。 (問題是,需要進行嵌套塊就可以進入遊戲):

# HEY IT IS ROCK PAPER SCISSORS! 
t = [ 
    [ 
    [["Armando", "P"],["Dave", "S"]], 
    [["Richard", "R"],["Michael", "S"]], 
    ], 
    [ 
    [["Allen", "S"],["Omer", "P"]], 
    [["David E.", "R"], ["Richard X.", "P"]] 
    ] 
] 

def rps_game_winner(game) 
    raise WrongNumberOfPlayersError unless game.length == 2 
    if (game[0][1] =~ /[r]/i && game[1][1] =~ /[s]/i) || 
     (game[0][1] =~ /[s]/i && game[1][1] =~ /[p]/i) || 
     (game[0][1] =~ /[p]/i && game[1][1] =~ /[r]/i) 
    return game[0] 
    elsif (game[0][1] =~ /[r]/i && game[1][1] =~ /[p]/i) || 
     (game[0][1] =~ /[s]/i && game[1][1] =~ /[r]/i) || 
     (game[0][1] =~ /[p]/i && game[1][1] =~ /[s]/i) 
    return game[1] 
    elsif game[0][1] == game[1][1] 
    return game[0] 
    else 
    raise NoSuchStrategyError.new 
    end 
end 

def rps_tournament_winner(t) 
    t.each do |level| 
    level.each do |game| 
     yield game 
    end 
    end 
end 

rps_tournament_winner(t) { |x| puts rps_game_winner(x) } 

此輸出

Dave 
S 
Richard 
R 
Allen 
S 
Richard X. 
P 
+0

人力資源管理模式......在我的情況下,發生的事情是,我有一個方法說'print_full_names (name)',其中'name'是一個這樣的數組:'[first,last]'。因此,我不需要傳入兩個變量,或者甚至是像'print_first_names'方法那樣的數組中的兩個元素,我需要做的是能夠傳入整個數組,然後讓該方法作用於array [0] '和'數組[1]'......如果這是有道理的話。 – marcamillion 2012-03-13 09:19:43

+0

我用更多的代碼和我得到的錯誤更新了這個問題。有什麼想法嗎? – marcamillion 2012-03-13 21:19:33

+0

你得到了錯誤,因爲你在屈服於錯誤的級別的對象;另一個「每個」等級使錯誤消失。不是100%我有你想要的答案,但它運行良好。 – 2012-03-14 01:46:24