我是否正确地扩展这个内置的Ruby类?(Am I extending this inbuilt ru

2019-09-26 09:55发布

在LIB / matrix.rb我的Rails应用程序我已经进入下面的代码扩展内置Matrix类:

module Matrix

  require 'matrix'

  class Matrix
    def symmetric?
      return false if not square?
      (0 ... row_size).each do |i|
        (0 .. i).each do |j|
          return false if self[i,j] != self[j,i]
        end
      end
      true
    end

    def cholesky_factor
      raise ArgumentError, "must provide symmetric matrix" unless symmetric?
      l = Array.new(row_size) {Array.new(row_size, 0)}
      (0 ... row_size).each do |k|
        (0 ... row_size).each do |i|
          if i == k
            sum = (0 .. k-1).inject(0.0) {|sum, j| sum + l[k][j] ** 2}
            val = Math.sqrt(self[k,k] - sum)
            l[k][k] = val
          elsif i > k
            sum = (0 .. k-1).inject(0.0) {|sum, j| sum + l[i][j] * l[k][j]}
            val = (self[k,i] - sum) / l[k][k]
            l[i][k] = val
          end
        end
      end
      Matrix[*l]
    end
  end
end

这是Rails应用程序中的方法添加到现有类的正确方法是什么? 我应该有要求矩阵行吗?

编辑1:附加信息提供

现在我已经删除了需要“矩阵”线。

如果我输入一个视图页面下面的测试代码, 它只能删除我的lib / matrix.rb文件

<% require 'matrix' %>

<%

m = Matrix[
   [0,0],
   [1,1]
   ]

%>

<%= m.column(0) %>

否则,它给人的错误:

undefined method `[]' for Matrix:Module

看来,我消除了内置Matrix类的默认方法,当我尝试扩展类。 有没有解决这个错误的方法吗?

Answer 1:

没有你不应该要求“矩阵”在这里。 谁用你的代码(Rails应用程序在你的情况),应使用需要“矩阵”



Answer 2:

为了扩展Rails的核心类,您只需打开它,添加您的方法,并关闭它。 例如,延长Matrix类:

class Matrix
  def my_method
    "New method"
  end
end

你不应该需要require 'matrix'在你的代码,通过。 只要文件来保存你的扩展是在自动加载路径之一,你应该有新的方法直接访问。

如果你需要一个目录添加到您的Rails的自动加载路径,只需更新/config/application.rb与以下行:

  • config.autoload_paths += %W(#{config.root}/app/extras) # Autoload /app/extras/*.rb


文章来源: Am I extending this inbuilt ruby class correctly?