2016-01-27 73 views
-1

爲什麼我不斷收到一個NameError,說Cherry是一個未初始化的常量,當我撥打Cherry.new?我還不熟悉創建子類。爲什麼我的子類一直說它沒有被初始化?

class Red 
    def initialize(options = {}) 
    @options = options 
    end 

    def instance_method_a 
    return @options[:a] if @options.has_key?(:a) 
    if @options.has_key?(:b) 
     #mathy code 
    end 
    end 

    def instance_method_b 
    return @options[:b] if @options.has_key?(:b) 
    if @options.has_key?(:a) 
     #mathy code 
    end 
    end 

    class Cherry < Red 
    def initialize(var) 
     self.new(:a => var) 
    end 
    end 

    class Vermillion < Red 
    def initialize(var) 
     self.new(:b => var) 
    end 
    end 
end 

我確定Vermillion將會像未初始化一樣。我需要能夠將變量分配給這些子類以通過實例方法運行它們。我怎樣才能讓這些工作?

+0

'子類A'不是有效的類名,在類名或任何變量/常量名中不能有空格。 –

+0

我編輯它。我正在改變名字,我只是搞砸了那部分。我的另一個程序只是把它作爲一個大寫的單詞。 –

+0

請使用'Class'以外的其他名稱,因爲Ruby已經有一個'Class'類,其中所有類都是其對象。如果仍然遇到問題,請發佈更新後的問題。 –

回答

2

您需要使用參數調用super來調用基類的initialize方法。

class Cherry < Red 
    def initialize(var) 
     super(:a => var) 
    end 
    end 

此外,您的子類名稱空間在主類內。你需要用命名空間來調用它們。

Red::Cherry.new(something: "here")

+0

試過了。 :/'super(:a => var)'拋出了一堆錯誤,'super(a:=> var)'給了我未初始化的常量NameError –

+0

等等,如果我嘗試初始化主類之外的子類上課,會有用嗎? –

+0

@SiouxsieAsylum是的,那麼你可以叫它沒有命名空間 – fylooi

0

爲什麼我總是收到一個NameErrorSubclass_A是未初始化的常數?

簡單:在您的代碼中沒有Subclass_A

相關問題