2010-03-28 58 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