【一人 Ruby Advent Calendar 2017】クラス名+メソッド名をいい感じに出力する【9日目】

一人 Ruby Advent Calendar 2017 9日目の記事になります。

デバッグ出力として "クラス名#メソッド名" を出力したい

デバッグを行っている際に次のように "クラス名#メソッド名" を文字列で出力したいことがあります。

class X
    def homu
        # クラス名#メソッド名
        p "X#homu"
    end
end

うーん、機械的に生成したいですね。

__method__ を使う

Ruby では __method__ で『現在の』メソッド名を取得することができます。 これを利用することで次のように機械的に生成することができます。

class X
    def homu
        # クラス名#メソッド名
        p "#{self.class.name}##{__method__}"
    end
end

モジュールの場合ちょっと問題がある

先ほどのコードをモジュールのメソッドで使用する場合問題があります。

module Mod
    def homu
        p "#{self.class.name}##{__method__}"
        # => X#homu
    end
end

class X
    include Mod
end

self.class.name をモージュルのメソッドで使用した場合、『mixin したクラスの名前』になってしまいます。

Method#owner を利用する

self.class.name ではなくて Method#owner を利用して定義しているクラス(モジュール)名を取得します。

module Mod
    def homu
        p "#{method(__method__).owner}##{__method__}"
        # => Mod#homu
    end
end

class X
    include Mod
end

これでおっけーです。