考虑以下延伸(多年来若干铁路码头的分布):
module Extension
def self.included(recipient)
recipient.extend ClassMethods
recipient.send :include, InstanceMethods
end
module ClassMethods
def macro_method
puts "Called macro_method within #{self.name}"
end
end
module InstanceMethods
def instance_method
puts "Called instance_method within #{self.object_id}"
end
end
end
如果您愿意向每个阶层介绍,你可以做以下工作:
Object.send :include, Extension
现在,你可以界定任何类别,使用宏观方法:
class FooClass
macro_method
end
#=> Called macro_method within FooClass
案例可以采用:
FooClass.new.instance_method
#=> Called instance_method within 2148182320
但是,即使<代码>Module.is_a?(目标),你也不能在模块中使用宏观方法。
module FooModule
macro_method
end
#=> undefined local variable or method `macro_method for FooModule:Module (NameError)
即便你将原来的<代码>Extension明确列入Module
,与Module.send(包括,推广)
。
对于个别单元,你可以按手方式包括推广和发挥同样的作用:
module FooModule
include Extension
macro_method
end
#=> Called macro_method within FooModule
但是,你如何在所有鲁比模块中添加类似宏观的方法?