2012-01-17 80 views
3

我遇到了奇怪的困難,開發一個項目。我沒有足夠的課程經驗,所以這就是我在這裏問的原因。我有一個類用一個參數初始化,我需要其他類來調用這個類的功能,但是我不能直到這個類被初始化,所以我問我該怎麼做。Ruby之間的類通信

下面是一些例子是我在談論:

class AVR 
    def initialize(device) 
     @device = device 
     @avr_conf = YAML::load(File.open("./devices/#{device}.yaml")) 
    end 

    def avr_conf 
     return @avr_conf 
    end 
end 

class IO 
    def setMode(a,b) 
     "#{AVR.avr_conf[a]} = #{b}" 
    end 
end 
+0

似乎是這裏沒有簡單的方法。 'AVR'需要一個'device'來初始化,'setMode'方法中沒有設備。你不向我們展示IO類的完整代碼嗎? – 2012-01-17 16:48:12

+0

@SergioTulentsev這只是想法,但我想以某種方式使Master類初始化後,每個子類也將被初始化,所以不會有缺失的卸載類? – 2012-01-17 16:50:38

+0

我覺得整個班級都沒有顯示。上面的代碼甚至不會運行?因爲'class IO'的'setMode'試圖在AVR上運行一個singleton方法...正確嗎?必須有更多的AVR ......一個'def self.avr_conf'必須在那裏? – slindsey3000 2012-01-17 17:25:47

回答

2

您可以:需要一個實例,或使avr_conf爲類方法(並以不同方式初始化)。

有了一個實例:

avr = AVR.new(a_device) 
avr.avr_conf[a] 

有了一個配置單(大約):

class AVR 
    def self.class_initialize(device) 
    @@avr_conf ... etc ... 
    end 

    def self.avr_conf 
    return @@avr_conf 
    end 
end 

那麼類IO需要使用更新的版本,但是這是適當的。

如果IO不打算/不能得到一個實例,類/ singleton-config 可能更有意義,雖然這種方法總是讓我有點緊張。

0

你可以有因方法簡單地拋出一個異常,如果獨立的類尚未初始化:但是

class IO 
    def setMode(a, b) 
    raise StandardError.new("AVR device is not initialized") unless AVR.avr_conf 
    AVR.avr_conf[a] = b 
    end 
end 

注意,這解決方案要求AVR類是單例(或模塊),因爲IO擴展方法需要知道應修改哪個實例。

+0

在這種情況下,'avr_conf'是一個實例方法,而不是一個類方法,所以它不那麼簡單。這個例子似乎有些困惑。 – tadman 2012-01-17 16:54:26

+0

@tadman:是的,因此關於實例的更新(您可能尚未加載)。 – maerics 2012-01-17 16:55:33

+0

啊,我現在看到了。這解釋了它。 – tadman 2012-01-17 20:27:17

0

Ruby類有兩種方法 - 實際上是classinstance方法。 類方法定義了self.前綴,有沒有需要初始化類:

class AVR 
    def self.avr_conf 
    'something here' 
    end 
end 

因此,在這種情況下,你必須調用:AVR.avr_conf得到'something here'結果。

但是,你的情況,@avr_conf變量定義在initialize方法,你必須與創建類的實例:

avr = AVR.new('something') 
avr.avr_conf[a] = b