- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オープンクラスで再定義時に別で定義されたメソッドの)
Ruby 2.1.5p273の条件下でメソッドの再定義時に別のメソッド呼び出しをする方法
このQ&Aのポイント
- Ruby 2.1.5p273の条件下で、オープンクラスで再定義する際に、別で定義されたメソッドを呼び出す方法について質問します。
- 特定の条件に基づいて特定のメソッドを再定義する必要があり、Hogeクラスのインスタンス作成後に特異メソッドとして新しいメソッドを追加することが難しい状況です。
- バージョンはRuby 2.1.5p273で、8~12行目のコードをどのように記述すれば良いか教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
fugaがクラスメソッドではなく、インスタンスメソッドとして定義されているのでその辺りで動かなくなっている感じですね。 Object#extendメソッドを使ったり幾つか回答がありますが、最小限の変更でやるなら下のようにnewメソッドでインスタンス作成をやる形で1箇所修正をかけるだけでいけそうですね。 class Hoge def fuga 1 end end class Hoge if self.new.fuga == 1 def piyo puts "foobarbaz" end end end # Hoge.new.piyo # これで実行確認。うまく動きました
お礼
ありがとうございます。 ご指摘のとおり、質問のコードは一旦インスタンス化することで動確できました。 クラス定義の中にあるコードがどのタイミングで動作しているのか、まだよく分かっていませんが、お話によるとインスタンスメソッドはインスタンス化されるまで未定義のようなのですね。Ruby の挙動を考えると、なるほどと感じました。 実は Hoge クラスは new によるインスタンス化ができず、別の編集不可能なモジュール関数の戻り値を受け取ってから使うクラスですので、`self.new.fuga` では対応することができませんでした(質問の条件不足で申し訳ありません)。 こちらについては、もう少し試行錯誤してみて、どうしても分からない場合に再提出させていただきたいと思います。 もちろん、私が提示しましたコードについては、動作できましたのでベストアンサーにさせていただきます。 ありがとうございました。