我被分配创建一个新的矩阵类。我不能使用需要的“矩阵”。
我有这个来访问矩阵的元素,其中@matrix 是一个数组数组。
def [] (i, j)
@matrix[i][j]
end
如果我尝试像这样访问它:
@a[0][0]
它不会工作。(参数数量错误)
但如果我这样做:
@a.[](0,0)
或者
@a[0,0]
它工作得很好。关于如何使其工作的任何想法?
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
您需要编写一个方法,要么递归地调用它,要么检查传递给函数的参数数量。很难说这是否有效,因为我没有整个班级,但这样的事情可能有效:
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
def [](i)
@matrix[i]
end
会做的,我猜。FWIW,Ruby's Matrix 的 [] 实现与您相同:[](i,j)