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

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