Ruby 获取模块'中包含的模块名称;s法
是否可以获取包含在其类方法中的模块的名称 一些代码满足以下示例:Ruby 获取模块'中包含的模块名称;s法,ruby,metaprogramming,Ruby,Metaprogramming,是否可以获取包含在其类方法中的模块的名称 一些代码满足以下示例: module Helper def module_name # return module name for which method is being called end def new_module name = module_name define_method :initialize_module do extend foo? ? Object.const_get("Ne
module Helper
def module_name
# return module name for which method is being called
end
def new_module
name = module_name
define_method :initialize_module do
extend foo? ? Object.const_get("New#{name}") : Object.const_get("Old#{name}")
end
end
end
module A
extend Helper
new_module
module NewA
def some_method
'Successfully extended NewA'
end
end
module OldA
def some_method
'Successfully extended OldA'
end
end
end
class B
include A
def initialize
initialize_module
end
def foo?
true
end
end
class C
include A
def initialize
initialize_module
end
def foo?
false
end
end
B.new.some_method
#=> 'Successfully extended NewA'
C.new.some_method
#=> 'Successfully extended OldA'
我以前从未动态定义过
模块
扩展方法,在类
上管理异常困难,但您始终可以使用中间模块来管理它,以帮助打包和导入方法,无论您想在哪里:
module Helper
def self.extended(base)
base_name = base.to_s
extension = Module.new
extension.send(:define_method, :module_name) do
base_name
end
base.send(:extend, extension)
end
end
module A
extend Helper
end
module B
extend Helper
end
A.module_name
# => "A"
B.module_name
# => "B"
这可能比定义模块实例变量要简单得多。实际上,闭包往往更干净。如果包含多个模块,该怎么办?没错,我已经更新了示例,使其更加具体。我提供的示例不够具体-我已经更新了。请看一看,谢谢!这就是我要找的!
module Helper
def self.extended(base)
base_name = base.to_s
extension = Module.new
extension.send(:define_method, :module_name) do
base_name
end
base.send(:extend, extension)
end
end
module A
extend Helper
end
module B
extend Helper
end
A.module_name
# => "A"
B.module_name
# => "B"