From: "KISHIMOTO, Makoto" Date: 2015-01-21T21:02:32+09:00 Subject: [ruby-list:50068] メソッドが無い「ふり」をする方法 きしもとです 内部(埋め込み)DSLなどで、Stringなど組込みクラスにモンキーパッチ的な ことをしたいが、他の部分に影響を与えたくない、とします。 ブロックを使って yield の前後でメソッド定義を追加したり削除したりして、 以下のように書けると思うわけですが、目的のコンテキスト以外の場合を スルーするために、カレントスレッドオブジェクトを使ってチェックする ことにしました。 # この方法についての議論もありそうですが、ここでの本題ではありません。 本題ですが、こういった場合に、メソッドが無い「ふり」をする方法の ベストプラクティスとしては、このように method_missing を呼ぶ、 という方法で良いでしょうか。もっと良い方法があるでしょうか? と いうのが質問です。 def with_to_yaml cur_th = Thread.current String.__send__(:define_method, :to_yaml){ unless Thread.current.equal? cur_th then method_missing :to_yaml end return self } yield String.__send__(:remove_method, :to_yaml) end with_to_yaml { p "hoge".to_yaml } # remove_method は ensure 節で実行するようにしたほうが # 良いですね...