【一人 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
これでおっけーです。