在ruby中创建矩阵类。[]方法
我被指派创建一个新的矩阵类。我不能使用“矩阵” 我用它来访问矩阵的元素,@matrix是数组的数组在ruby中创建矩阵类。[]方法,ruby,class,methods,matrix,arguments,Ruby,Class,Methods,Matrix,Arguments,我被指派创建一个新的矩阵类。我不能使用“矩阵” 我用它来访问矩阵的元素,@matrix是数组的数组 def [] (i, j) @matrix[i][j] end 如果我尝试这样访问它: @a[0][0] @a.[](0,0) 这行不通。(参数数量错误) 但如果我这样做: @a[0][0] @a.[](0,0) 或 它很好用。 有什么办法让它工作吗 def [] (i, j) @matrix[i][j] end 根据方法[]它需要两个参数。但是@a[0][0]不会这样做,因为
def [] (i, j)
@matrix[i][j]
end
如果我尝试这样访问它:
@a[0][0]
@a.[](0,0)
这行不通。(参数数量错误)
但如果我这样做:
@a[0][0]
@a.[](0,0)
或
它很好用。
有什么办法让它工作吗
def [] (i, j)
@matrix[i][j]
end
根据方法[]
它需要两个参数。但是@a[0][0]
不会这样做,因为这里您只传递了方法[]
一个参数,即0
。只有所以你错了。但是@a.[](0,0)
或@a[0,0]
是完美的,因为您正在向方法[]
发送两个参数。当您编写@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
根据方法[]
它需要两个参数。但是@a[0][0]
不会这样做,因为这里您只传递了方法[]
一个参数,即0
。只有所以你错了。但是@a.[](0,0)
或@a[0,0]
是完美的,因为您正在向方法[]
发送两个参数。当您编写@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 [] (*cords)
return @matrix[*cords] if cords.size == 1
@matrix[cords.first][cords.last]
end
或适用于任意数量维度的递归版本:
def [] (*cords)
cords.inject(@matrix){|m, c| m[c]}
end
我想我会的。FWIW,Ruby的矩阵[]实现了与您相同的功能:
我想我会的。FWIW,Ruby的矩阵[]实现了与您相同的功能:谢谢您的回答。我明白你的意思,但是你会怎么做呢?我的意思是,你如何修改代码使@a[0][0]工作?你的代码不适用于单索引调用。您需要将
@matrix[a]
更改为@matrix[*a]
,谢谢您的回答。我明白你的意思,但是你会怎么做呢?我的意思是,你如何修改代码使@a[0][0]工作?你的代码不适用于单索引调用。您需要将@matrix[a]
更改为@matrix[*a]
只是一个问题,这是否也能像您期望的那样工作<代码>def[](*跳线);cords.inject(@matrix){| m,c | m[c]}end只是一个问题,这是否也能像您期望的那样工作<代码>def[](*跳线);cords.inject(@matrix){| m,c | m[c]}end