2012-01-30 54 views
1

在我的Rails应用程序中的lib/matrix.rb我已经进入下面的代码扩展内置Matrix类:我是否正确地扩展了这个内置的ruby类?

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应用程序中的方法添加到现有类的正确方法是什么?我应该有需要矩阵线吗?

EDIT 1:提供

附加信息我现在已经除去需要 '矩阵' 线。

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

<% require 'matrix' %> 

<% 

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

%> 

<%= m.column(0) %> 

否则,它给人的错误:

undefined method `[]' for Matrix:Module 

当我尝试扩展类时,我似乎消除了构建在Matrix类中的默认方法。有没有解决这个错误的方法?

回答

1

不,你不应该在这里需要'矩阵'。谁使用你的代码(在你的情况下Rails应用程序),应该使用require'矩阵'

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
+0

好,谢谢,我已经添加了对这个问题的一些附加信息我在上面 – Zakoff 2012-01-30 21:35:13