rubyco(るびこ)の日記 RSSフィード

2006-11-21

メソッドがどこで定義されているか

putsはどこで定義されているかを踏まえて、メソッドがどこで定義されているかを無理矢理求めてみます。

class Method
  def where
    to_s =~ /#<Method: (\w+)(\((\w+)\))?#/
    if $3
      return $3
    else
      return $1
    end
  end
end

module Rubymod
  def m
  end
end

class Rubyco
  include Rubymod
  def c
  end
end

r = Rubyco.new
p r.method(:m).where      #=> "Rubymod"
p r.method(:c).where      #=> "Rubyco"

疑問:このModule#whereメソッドモジュールまたはクラスの「名前」しか得られません。モジュールオブジェクトまたはクラスオブジェクトを得るにはどうしたら良いんでしょうね。

sumimさんのコメントを元に、Object.const_getを使うことで解決しました。いつもありがとうございます。

class Method
  def where
    to_s =~ /#<Method: (\w+)(\((\w+)\))?#/
    Object.const_get($3 ? $3 : $1)
  end
end

module Rubymod
  def m
  end
end

class Rubyco
  include Rubymod
  def c
  end
end

r = Rubyco.new
p r.method(:m).where        #=> Rubymod
p r.method(:c).where        #=> Rubyco
p r.method(:m).where.class  #=> Module
p r.method(:c).where.class  #=> Class

sumimsumim 2006/11/21 17:45 const_get (http://d.hatena.ne.jp/rubyco/20060311/constants) との組み合わせではダメですか?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証