2011-03-21 41 views
1

我做了一個矩陣類,我想在我的代碼的各個部分使用它。Ruby Class#new - 爲什麼`new`是一個私有方法?

class Matrix 
    def initialize(x, y, v=0) 
    @matrix = Array.new 
    (0..y).each do |j| 
     @matrix[j] = Array.new 
     (0..x).each do |i| 
     @matrix[j][i] = v 
     end 
    end 
    end 
end 

當這段代碼與使用它的代碼包含在同一個類中時,一切運行良好。

當我提出這個代碼lib/matrix.rb和需要它,我得到以下錯誤:

./phylograph:30:in `block in run': private method `new' called for Matrix:Class (NoMethodError) 
+0

我們可以看到最後的'matrix.rb'文件嗎?這段代碼看起來沒有什麼特別的效果。 – Matchu 2011-03-21 16:37:56

回答

5

我記得,Matrix是純粹的functional類;它的對象是不可變的,並且簡單地創建一個新的對象通常是無用的,因爲API沒有任何可變操作。

因此,新的Matrix對象是由API創建的,只是在用戶級別上不使用new

這是作者的設計決定。

更新:OIC,您無意使用標準庫Matrix類。因此,上述在技術上是你的問題的原因,但它會更有助於我只是說:

Your definition of Matrix is clashing with the Ruby Standard Library class of the same name.

+0

D'oh!就在我開始享受Ruby開放課程的能力時,它讓我咬牙切齒。 – 2011-03-21 17:23:45

+4

所以你必須問自己:「矩陣」是什麼? – 2011-03-21 22:24:57

6

這是因爲​​,試着給你的類不同的名稱或把它放在一個模塊內部。

1

至於爲什麼錯誤僅位,當你把它搬到lib/matrix.rb

之前你移動它,你的代碼中沒有require 'matrix',所以你沒有加載矩陣標準庫。但是,當您移動它並在代碼中添加require 'matrix'時,您將加載矩陣標準庫。

這就是爲什麼在編寫庫時,建議您使用only make one file visible to other code。想象一下,如果matrix庫的其他文件對其他代碼可見,那麼問題會變得更糟!

相關問題