解决mixin多重继承中共享变量:
如下例,在不同的对象调用时,将可能得不到想要的结果。
module Observable def observers @observer_list ||= [] end def add_observer(obj) observers << obj end def notify_observers observers.each {|o| o.update} end end
下面的类使用Observable模块的一个类,但它自己也有一个@observer_list的实例变量。
class TelescopeScheduler # other classes can register to get notifications # when the schedule changes include Observable def initialize @observer_list = [] # folks with telescope time end def add_viewer(viewer) @observer_list << viewer end end
解决上面的问题即是确保它们有一个唯一的名字。
感觉此方法最合适: 模块可以使用模块一级的散列表,以当前对象的ID作为索引,来保存特定于实例的数据,而不必使用RUBY的实例变量。
module Test State = {} def state=(value) State[object_id] = value end def state State[object_id] end end class Clen include Test end