1

我被分配创建一个新的矩阵类。我不能使用需要的“矩阵”。

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

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

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

@a[0][0]

它不会工作。(参数数量错误)

但如果我这样做:

@a.[](0,0)

或者

@a[0,0]

它工作得很好。关于如何使其工作的任何想法?

4

3 回答 3

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

根据方法[],它需要 2 个参数。但@a[0][0]不这样做,因为在这里你只传递了[]1 个参数,即0。只要。所以你得到了错误。但是@a.[](0,0)or@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
于 2013-11-06T11:26:23.970 回答
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
于 2013-11-06T11:36:10.343 回答
0
def [](i)
  @matrix[i]
end

会做的,我猜。FWIW,Ruby's Matrix 的 [] 实现与您相同:[](i,j)

于 2013-11-06T11:39:56.370 回答