在ruby中创建矩阵类。[]方法

在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]不会这样做,因为

我被指派创建一个新的矩阵类。我不能使用“矩阵”

我用它来访问矩阵的元素,@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]
不会这样做,因为这里您只传递了方法
[]
一个参数,即
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