2013-03-12 76 views
1

我已經B類從類A衍生,等的訪問名稱時未初始化的常數:紅寶石 - NameError:我的派生類

class A 
.. 
end 

class B < A 
... 
end 

在另一文件I中定義的變量M

M = B 

然後我得到了錯誤

"NameError: uninitialized constant B". 

我發現,如果我寫

M=A 
M=B 

然後就可以了。看來我必須以某種方式初始化A.

+0

爲什麼不繼續前進,做一個電話? – sawa 2013-03-12 17:42:51

+0

我以此作爲臨時的方式。我只是覺得這不太自然。我猜,Ruby應該有它的語法解決方案。 – user1991452 2013-03-12 18:01:55

+0

這沒有任何意義,你使用的是什麼版本的紅寶石? 我只是做了以下test.rb類A 結束 B類 Mike 2013-03-12 18:10:36

回答

0

由於文件與rails沒有任何關係,我們假設它們是系統上任何文件夾中的兩個獨立文件。 假設他們在同一個目錄中。

class_def.rb:

class A 
    def self.talk 
    puts 'hello' 
    end 
end 

class B < A 
    def self.talk 
    super() 
    puts 'world' 
    end 
end 

runner.rb:

require './class_def.rb' 
M=B 
M.talk 

調用紅寶石runner.rb應該產生輸出

hello 
world 

但是我注意到使用RubyFiddle同樣的錯誤

瓦特/的方法http://rubyfiddle.com/riddles/1d8e2

呼叫W/O的方法http://rubyfiddle.com/riddles/1d8e2/

+0

事情是類A和B在同一個文件中,而我從另一個文件訪問它們。我可以在沒有這個需求聲明的情況下訪問A,那麼訪問B時爲什麼需要這個? – user1991452 2013-03-12 20:34:44

+0

如何在不需要文件的情況下訪問A?你一定在做一些你沒有說的東西。 – Mike 2013-03-13 16:25:03

+0

這是一個紅寶石項目。我把我的類定義文件放在app/models目錄下,rails應該自動需要這個文件。我必須強調,我的類A不是ActiveRecord的子類。它只是獨立的。 – user1991452 2013-03-14 00:03:42