大佬教程收集整理的这篇文章主要介绍了Ruby中的事件怎么做?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问题是我对Ruby的书甚至不提及事件,更不用说提供例子了.有人能帮我吗?
class EventHandlerArray < Array def add_handler(code=nil,&block) if(codE) push(codE) else push(block) end end def add raise "error" end def remove_handler(codE) delete(codE) end def fire(E) reverse_each { |handler| handler.call(E) } end end # with this,you can do: # event.add_handler # event.remove_handler # event.fire (usually never used) # fire_event # when_event # You just need to call the events method and call super to initialize the events: # class MyControl # events :mouse_down,:mouse_up,# :mouse_enter,:mouse_leave # def initialize # super # end # def when_mouse_up(E) # # do something # end # end # control = MyControl.new # control.mouse_down.add_handler { # puts "Mouse down" # } # As you can see,you can redefine when_event in a class to handle the event. # The handlers are called first,and then the when_event method if a handler didn't # set e.handled to true. If you need when_event to be called before the handlers,# override fire_event and call when_event before event.fire. This is what painTing # does,for handlers should paint after the control. # class SubControl < MyControl # def when_mouse_down(E) # super # # do something # end # end def events(*symbols) # NOTE: Module#method_added # create a module and 'include' it modName = name+"Events" initStr = Array.new readerStr = Array.new methodsStr = Array.new symbols.each { |sym| name = sym.to_s initStr << %Q{ @#{name} = EventHandlerArray.new } readerStr << ":#{name}" methodsStr << %Q{ def fire_#{name}(E) @#{name}.fire(E) when_#{name}(E) if(!e.handled?) end def when_#{name}(E) end } } eval %Q{ module #{modNamE} def initialize(*args) begin super(*args) rescue NoMethodError; end #{initStr.join} end #{"attr_reader "+readerStr.join(',')} #{methodsStr.join} end include #{modNamE} } end class Event attr_writer :handled def initialize(sender) @sender = @sender @handled = false end def handled?; @handled; end end
以上是大佬教程为你收集整理的Ruby中的事件怎么做?全部内容,希望文章能够帮你解决Ruby中的事件怎么做?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。