Ruby方法可以接受2D数组作为参数吗?

时间:2012-03-13 01:16:12

标签: 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

6 个答案:

答案 0 :(得分:2)

更改方法定义,如下所示:def who_wins?(game)代替def who_wins?(*game)

您使用的是Splat Operator,在您的情况下不需要。

如果您想了解有关Ruby Splat Operator的更多信息,请点击here

答案 1 :(得分:1)

您需要有一个变量参数列表。

def people(*arrays)
  puts arrays.length
end

也就是说,如果您想按照指定的方式传入人员。否则你只需要使用一个参数:

def people(arrayOfArrays)
  puts arrayOfArrays.length
end

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

答案 2 :(得分: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

答案 3 :(得分:1)

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

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

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

这对我有用。

答案 4 :(得分:0)

这只是

def people(twoDArray)

然后你可以做像

这样的事情
twoDArray[0][1]

答案 5 :(得分:0)

将2D数组传递给此方法对我有用:

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

end