我是否正确地扩展了这个内置的ruby类?

时间:2012-01-30 20:38:57

标签: ruby-on-rails-3 class

在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类的默认方法。有没有办法解决这个错误?

2 个答案:

答案 0 :(得分:1)

不,你不应该要求&#39;矩阵&#39;这里。无论谁使用您的代码(在您的情况下使用rails app),都应使用require&#39; matrix&#39;

答案 1 :(得分:0)

要在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