在
Ruby中,我想让一个类包含一系列模块,并让这些单独的模块在初始化该类时执行一个块或方法(或者只是找到一些编辑实例变量的方法).我知道我可以通过在模块中创建一个方法然后在类的initialize方法中调用它来实现这一点,但是我想通过简单地包含模块并调用一个方法来执行模块添加到初始化的任何代码来实现这一点.这样我就可以在类中包含大量的东西,而不必担心在包含的每个模块的initialize方法中添加一行代码.我已经检查了别名,超级和相关的东西,但没有得到任何东西……如果它有助于理解我希望在这里完成的一些伪代码:
module Mod1 call_this_block_on_initialize { @a.push 4 } end module Mod2 call_this_block_on_initialize { @a.push 5 } end class Test attr_accessor :a include Mod1 include Mod2 def initialize @a = [1,2,3] call_those_blocks_set_by_mods end end t = Test.new t.a # returns [1,3,4,5]
这可能有点罗嗦,但我认为标题总结了我正在努力做的事情.谢谢你的帮助!
解决方法
有几种方法可以做到这一点.此示例将重新定义initialize方法并添加您想要的任何额外代码:
module MyModule def self.included(base) # built-in Ruby hook for modules base.class_eval do original_method = instance_method(:initialize) define_method(:initialize) do |*args,&block| original_method.bind(self).call(*args,&block) @a.push 4 # (your module code here) end end end end class Test attr_accessor :a def initialize @a = [1,3] end # It must be included after the `initialize` # definition or the module won't find the method: include MyModule end
然而:我认为你真正想要的是子类化.如果你有很多类似行为的类,就像你看到的那样,问问自己是否有一个自然的抽象父类.你能解释一下你用super做了什么,为什么它不起作用?