我在一个模块中放了一些功能,由一个对象扩展.我想在扩展模块时自动执行功能.但是,它必须在实例的上下文中执行,而不是在Module中执行.
module X
extend self
@array = [1,2,3]
end
obj.extend(X)
Run Code Online (Sandbox Code Playgroud)
目前,@ array未在实例中创建.我不希望强制开发人员调用一些初始化方法,因为对于每个模块,他需要知道要调用的唯一方法的名称.这可能吗 ?
Vic*_*gin 11
您可以在扩展和BasicObject#instance_exec(或BasicObject#instance_eval)上使用Module#extended hook作为执行代码,以便在扩展对象的上下文中执行任意代码:
module X
def self.extended(obj)
obj.instance_exec { @array = [1,2,3] }
end
end
class O
attr_reader :array
end
obj = O.new
obj.array # => nil
obj.extend(X)
obj.array # => [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3023 次 |
| 最近记录: |