-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管理するのは非常に困難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 に答える