在ruby中创建Matrix类。方法

时间:2013-11-06 11:25:25

标签: ruby class methods matrix arguments

我被指派创建一个新的矩阵类。我不能使用require'Matrix'。

我有这个来访问矩阵的元素,其中@matrix是一个数组数组。

def [] (i, j)
  @matrix[i][j]
end

如果我试图像这样访问它:

@a[0][0]
它不会工作。 (参数数量错误)

但如果我这样做:

@a.[](0,0)

@a[0,0]

它运作得很好。 关于如何使其发挥作用的任何想法?

3 个答案:

答案 0 :(得分:1)

def [] (i, j)
  @matrix[i][j]
end

根据方法[],它需要2个参数。但是@a[0][0]并没有这样做,因为在这里你只传递方法[]一个参数,即e 0。只要。所以你得到了错误。但@a.[](0,0)@a[0,0]是完美的,因为您向方法[]发送了2个参数。当您编写@a[0,0]时,Ruby会在内部将方法调用为@a.[](0,0)

  

如何修改代码,以便@a [0] [0]有效?

这是一个代码示例:

class Matrix
    def initialize(a)
        @matrix=a
    end
    def [](*a)
         a.size == 1 ? @matrix[*a] : @matrix[a.first][a.last]
    end
end
a = [[1,2,3],[4,7,5],[11,21,33]]
m = Matrix.new(a)
p m[2,2] # => 33

答案 1 :(得分:0)

您需要编写一个方法,可以递归地调用它,也可以检查传递给函数的参数数量。很难说这是否有效,因为我没有全班,但这样的事情可能有用:

def [] (*cords)
  return @matrix[*cords] if cords.size == 1
  @matrix[cords.first][cords.last]
end

或适用于任何数字维度的递归版本:

def [] (*cords)
   cords.inject(@matrix){|m, c| m[c]}
end

答案 2 :(得分:0)

def [](i)
  @matrix[i]
end
我猜,会这样做的。 FWIW,Ruby的Matrix []实现与您相同:[](i,j)