0

Mこのモジュールに混在するクラスが特定のメソッド名が特別かどうかをチェックできるように、特定のメソッドに「特別」のタグを付けたいモジュールがあります。これは私が試したことです:

module M
  def specials
    @specials ||= {}
  end

  def self.special name
    specials[name] = true
  end

  def is_special? name
    specials[name]
  end

  def meth1
    ...
  end
  special :meth1
end

class C
  include M

  def check name
    is_special? name
  end
end

クラスメソッドからインスタンスメソッドを呼び出すことができないため、もちろんこれは機能しませんself.special。モジュール内の必要なメソッドの下で呼び出すことができるという機能を保持したい場合はspecial :<name>、クラス変数を使用するしかないと思います (例:@@specials誰かが私が間違っていることを証明できますか?)

4

1 に答える 1

0

これらすべてのメソッドをクラス メソッドにして、次の操作を実行できます。

module M
  def self.specials
    @specials ||= {}
  end

  def self.special name
    self.specials[name] = true
  end

  def self.is_special? name
    self.specials[name]
  end

  def meth1
    'foo'
  end

  def meth2
    'bar'
  end

  special :meth1
end

class C
  include M

  def check name
    M.is_special? name
  end
end

p C.new.check(:meth1)
#=> true
p C.new.check(:meth2)
#=> nil

それがうまくいくかどうかはわかりません。

于 2012-08-26T14:46:29.437 に答える