2012-03-13 122 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 
相关问题