Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 获取模块'中包含的模块名称;s法_Ruby_Metaprogramming - Fatal编程技术网

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"