Ruby:通过模块向初始化方法添加内容
在Ruby中,我想让一个类包含一系列模块,并让这些单独的模块在初始化该类时执行一个块或方法(或者只是找到编辑实例变量的方法)。我知道我可以通过在模块中创建一个方法,然后在类的“initialize method”中调用它来实现这一点,但我想通过简单地包含模块并调用一个方法来执行模块添加到initialize中的任何代码,这样,我就可以在一个类中包含大量的内容,而不用担心在initialize方法中为包含的每个模块添加一行代码。我已经检查了别名、超级和相关的东西,但没有得到任何东西。。。如果这有助于理解我希望实现的目标,这里有一些伪代码:Ruby:通过模块向初始化方法添加内容,ruby,module,initialization,Ruby,Module,Initialization,在Ruby中,我想让一个类包含一系列模块,并让这些单独的模块在初始化该类时执行一个块或方法(或者只是找到编辑实例变量的方法)。我知道我可以通过在模块中创建一个方法,然后在类的“initialize method”中调用它来实现这一点,但我想通过简单地包含模块并调用一个方法来执行模块添加到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, 2, 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, 2, 3]
end
# It must be included after the `initialize`
# definition or the module won't find the method:
include MyModule
end
但是:
我认为你真正想要的是子类化。如果您有很多具有类似行为的类,就像您所做的那样,那么问问自己是否有一个自然抽象的父类。你能解释一下你用super做了什么,为什么它不起作用吗?你说得对,我研究了super是如何工作的,我能够为添加的任何数量的模块执行代码,无论是什么组合或是哪个模块。基本上为模块制作了一系列超级链接:这真是太贵了,谢谢。我用它来分离Rails CanCan授权模式的
ability.rb
文件: