2010-03-28 64 views
2

我正在爲Ruby Gosu庫開發(以及至少嘗試)Game框架。我做了一個基本的事件系統,每個Blocks :: Event都有一個處理程序列表,當事件被觸發時,這些方法被調用。目前,實現事件的方法如下:在方法Defenition之外定義實例變量(ruby)

class TestClass 

    attr_accessor :on_close 

    def initialize 
     @on_close = Blocks::Event.new 
    end 

    def close 
     @on_close.fire(self, Blocks::OnCloseArgs.new) 
    end 
end 

但是實現這一事件的方法似乎是相當長的,我的問題是,我怎麼能做出一種方式,這樣,當一個人想在一個類的事件,他們可以做到這一點

class TestClass 

    event :on_close 

    def close 
     @on_close.fire(self, Blocks::OnCloseArgs.new) 
    end 
end 

在此先感謝,埃爾。

回答

1

我並不完全明白你想要做什麼,但你可以儘量避免使用initialize方法以下列方式:

class TestClass 

    event :on_close 

    def close 
     @on_close ||= Blocks::Event.new 
     @on_close.fire(self, Blocks::OnCloseArgs.new) 
    end 
end 

||=成語讓您在紅寶石懶洋洋地初始化實例變量。

1

下是完全未經測試,但也許它可以讓你開始:

class Blocks 
    class Event 
    # dummy 
    end 
end 

class Class 
    def event(*args) 
    define_method :initialize do 
     args.each { |a| instance_variable_set("@#{a}", Blocks::Event.new) } 
    end 
    end 
end 

class TestClass 
    event :on_close 

    def close 
     #@on_close.fire(self, Blocks::OnCloseArgs.new) 
     p @on_close 
    end 
end 

test = TestClass.new 
test.close 
# => #<Blocks::Event:0x10059a0a0> 
p test.instance_variables 
# => ["@on_close"] 

根據欄杆的評論編輯。

+0

確實如此。正如我所說,只是一個未經測試的快速拍攝,感謝您指出:-) – 2010-03-28 21:19:31

+0

它似乎工作在一個不需要初始化邏輯的類,這意味着我需要做一個別名,以及對我來說,有點了反紅寶石,投入更多的工作超過必要,所以我只是堅持手動添加它,也許我會找到一種方式,但現在它的直到我們再次見面:) – Ell 2010-03-29 19:24:55