2012-01-30 49 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