我有一个模块,可以在包含到类中时添加类方法。
我想强制这个模块通过编写第一个将包含的另一个模块来扩展新方法。
以下代码给出了我想要做的不起作用的示例: 如果能够覆盖第一个模块的“self.included”函数以使用我的方法扩展基数,那将是很棒的。
到目前为止,我能够覆盖第一个模块的self.included函数,但调用super不起作用,所以我松开了第一个模块的类方法:
module SomeModule
def self.included(base)
base.send(:extend, ClassMethods)
end
module ClassMethods
# Some methods
end
end
module MyNewModule
def self.included(base)
base.class_eval do
def self.included(base)
base.send(:extend, ClassMethods)
super(base)
end
end
end
module ClassMethods
def my_method
end
end
end
SomeModule.send(:include, MyNewModule)
class Pouet
include SomeModule
my_method # undefined local variable or method `my_method' for Pouet:Class (NameError)
end
这可能吗?
答案 0 :(得分:0)
在包含的块中使用instance_eval。
在instance_eval块中,您可以访问包含它的对象,因此您应该可以在那里包含额外的模块。
编辑:
您必须将字符串传递给instance_eval,因为该块将存储您当前的上下文。
我举例说明了https://github.com/JoePym/UndergroundFootball/blob/master/app/models/player.rb#L14
答案 1 :(得分:0)
最后设法让它自己工作。
请告诉我这是好事还是坏事:
module SomeModule
def self.included(base)
base.send(:extend, ClassMethods)
end
module ClassMethods
def my_original_method
end
# Some methods
end
end
module MyNewModule
def self.included(base)
base.class_eval do
class << self
alias_method :old_included, :included
def included(base)
old_included(base)
base.send(:extend, ClassMethods)
end
end
end
end
module ClassMethods
def my_method
end
end
end
SomeModule.send(:include, MyNewModule)
class Pouet
include SomeModule
my_original_method
my_method
end