2012-03-13 121 views
2

說我想通過這樣的數組:Ruby方法可以接受二維數組作爲參數嗎?

[['Person1', '14'], ['Person2', '26']] 

的方法,我會怎麼做呢?

我想:

def people([person1, age1], [person2, age2]) 

但拋出一個錯誤。

想法?

EDIT1:這是我的實際代碼,以及錯誤消息被產生:

def who_wins?(*game) 
    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][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][0] 
    elsif game[0][1] == game[1][1] 
     return game[0][0] 
    elsif 
     raise NoSuchStrategyError.new 
    end 
end 

當我聲明一個二維數組是這樣的:

g = [["Marc", "R"], ["Sandy", "S"]] 

和我將它傳遞給方法像:

who_wins?(g) 

我收到此錯誤:

NoMethodError: undefined method `[]' for nil:NilClass 
+1

的問題是不明確的。你想直接訪問數組內的變量嗎? – sawa 2012-03-13 01:19:08

+0

如果你只是想傳遞給一個方法,什麼是def? – 2012-03-13 01:21:44

+1

@sawa是的,我確實想訪問數組中的變量。所以我想能夠檢查一下person1的年齡是否爲14,如果是...則返回'X'。 – marcamillion 2012-03-13 01:26:38

回答

1
def people(((person1, age1), (person2, age2))) 
puts "Person1 is #{person1}" 
puts "Age1 is #{age1}" 
puts "Person2 is #{person2}" 
puts "Age2 is #{age2}" 
end 

people([['Person1', '14'], ['Person2', '26']]) 
# => "Person1 is Person1" 
# => "Age1 is 14" 
# => "Person2 is Person2" 
# => "Age2 is 26" 

編輯

def who_wins?(game) 
    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][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][0] 
    elsif game[0][1] == game[1][1] 
     return game[0][0] 
    elsif 
     raise NoSuchStrategyError.new 
    end 
end 

p who_wins?([["Marc", "R"], ["Sandy", "S"]]) # => "Marc" 

EDIT2 順便問一下,你的代碼可以重構這樣的:

def who_wins?(game) 
    case game.map{|_, tactics| tactics.downcase} 
    when %w[r p], %w[s r], %w[p s] 
     game[1][0] 
    when %w[r s], %w[s p], %w[p r], %w[r r], %w[s s], %w[p p] 
     game[0][0] 
    else 
     NoSuchStrategyError.new 
    end 
end 
+0

雖然我喜歡這個解決方案,但我更喜歡更優雅的'(* array)'。我用我的確切代碼和我現在看到的錯誤更新了這個問題。關於如何解決這個問題的想法? – marcamillion 2012-03-13 01:38:59

+0

@marcamillion在這種情況下,你不需要''''或做任何其他特殊的事情。看到我的答案。 – sawa 2012-03-13 01:44:55

+0

如果我拿出'*'它不起作用。沒關係,它確實如此。 – marcamillion 2012-03-13 01:50:32

0

這將是剛剛

def people(twoDArray) 

,然後你可以做這樣的事情

twoDArray[0][1] 
+0

我試過這個,但後來我得到一個參數錯誤: 'ArgumentError:錯誤的參數數量(2爲1)' – marcamillion 2012-03-13 01:21:05

+0

我已經用我的實際代碼更新了這個問題,我得到的錯誤。思考? – marcamillion 2012-03-13 01:38:17

1

你需要有一個變量參數列表。

def people(*arrays) 
    puts arrays.length 
end 

也就是說,如果你想按照你指定的方式傳入人員。否則,你只是使用像一個參數:

def people(arrayOfArrays) 
    puts arrayOfArrays.length 
end 

people([['Person1', '14'], ['Person2', '26']]) 
+0

我將如何訪問方法內數組內的元素? 例如說我想'放人14歲的人'......我該怎麼做呢? – marcamillion 2012-03-13 01:25:38

+0

puts arrayOfArrays [0] [0] +「of age」+ arrayOfArrays [0] [1] – bcarlso 2012-03-13 01:27:23

+0

所以我喜歡這個,但是我得到一個'NoMethodError:undefined方法'[]'爲nil:NilClass'。我把我的代碼和我在問題中所做的完整解釋。刷新並讓我知道你的想法......如果可以的話。謝謝。 – marcamillion 2012-03-13 01:37:55

1
def who_wins?(game) 
#.... 
end 

print who_wins([['Person1', 's'], ['Person2', 'r']]) 

# Output # 
# ['Person2', 'r'] 

這是爲我工作。

+0

這不適合我。當我嘗試運行時遇到同樣的錯誤。 – marcamillion 2012-03-13 01:46:38

+0

那你就是在做別的事情。這就是你如何傳遞數組作爲參數。 – 2012-03-13 02:03:40

2

改變你這樣的方法定義:代替,def who_wins?(*game)

你正在使用的不是你的情況需要啪操作。

如果您想了解更多關於Ruby啪操作,然後單擊here

0

傳遞一個二維數組這種方法工作對我來說是這樣的:

def method_name(arr=Array.new(size){Array.new(size)}) 

end 
相關問題