Is there any clean way to initialize instance variables in a Module intended to be used as Mixin? For example, I have the following:
module Example
def on(...)
@handlers ||= {}
# do something with @handlers
end
def all(...)
@all_handlers ||= []
# do something with @all_handlers
end
def unhandled(...)
@unhandled ||= []
# do something with unhandled
end
def do_something(..)
@handlers ||= {}
@unhandled ||= []
@all_handlers ||= []
# potentially do something with any of the 3 above
end
end
Notice that I have to check again and again if each @member has been properly initialized in each function — this is mildly irritating. I would much rather write:
module Example
def initialize
@handlers = {}
@unhandled = []
@all_handlers = []
end
# or
@handlers = {}
@unhandled = []
# ...
end
And not have to repeatedly make sure things are initialized correctly. However, from what I can tell this is not possible. Is there any way around this, besides adding a initialize_me method to Example and calling initialize_me from the extended Class? I did see this example, but there’s no way I’m monkey-patching things into Class just to accomplish this.
Edit: Note that this is setting a class instance variable. Instance variables on the instance can’t be created when the module is mixed into the class, since those instances haven’t been created yet. You can, though, create an initialize method in the mixin, e.g.:
There may be a way to do this while calling the including class’s initialize method (anybody?). Not sure. But here’s an alternative: