-1

是否可以获得包含在其类方法中的模块名称?

一些满足以下示例的代码:

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'
4

2 回答 2

4

我以前从来没有动态定义module扩展方法,在 a 上管理起来异常困难,class但你总是可以使用中间模块来管理它,以帮助在任何你想要的地方打包和导入方法:

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"

这可能比定义模块实例变量要简单得多。在实践中,闭包往往更干净。

于 2012-12-14T09:33:03.020 回答
1
module A
  def module_name
    A.class_name
  end
end

class B
  include A
end

B.new.module_name  # => 'A'
于 2012-12-14T06:24:45.160 回答