【问题标题】:Creating a Matrix class in ruby. The [] method在 ruby​​ 中创建一个 Matrix 类。方法
【发布时间】:2013-11-17 14:47:57
【问题描述】:

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

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

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

如果我尝试这样访问它:

@a[0][0]

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

但如果我这样做:

@a.[](0,0)

@a[0,0]

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

【问题讨论】:

  • 只是一个问题,这是否也像您期望的那样工作? def [] (*cords); cords.inject(@matrix){|m, c| m[c]} end

标签: ruby class methods matrix arguments


【解决方案1】:
def [] (i, j)
  @matrix[i][j]
end

根据[] 方法,它需要2 个参数。但是@a[0][0] 并没有这样做,因为在这里您只传递了方法[] 1 个参数,即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

【讨论】:

  • 感谢您的回答。我明白你在说什么,但你会怎么做呢?我的意思是,你应该如何修改代码以使 @a[0][0] 起作用?
  • 您的代码不适用于单索引调用。您需要将@matrix[a] 更改为@matrix[*a]
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    def [](i)
      @matrix[i]
    end
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-27
      • 2017-02-17
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      相关资源
      最近更新 更多