宝石

2017-02-15 14 views
0

で定義されたクラスを拡張するのは、私はクラスAwesomeClassを定義する仮想的な宝石、my_gemを、持っている、と宝石がAwesomeClassのみ動作するバイナリが含まれていますが、私の中に任意のコードをロードしますと言ってみましょうlib/ディレクトリ。クラスのメソッドのいくつかをきれいに拡張したいときは、superと同等のものを呼び出すことがあります。宝石

のは、それは次のようになりましょう:

AwesomeClass.class_eval 
     def cool_method 
     (call the original method here) 
     ... 
     end 
    end 

あなたはそれをどのようにします:

class AwesomeClass 
     def cool_method 
     ... 
     end 
    end 

そしてこちらに、マイライブラリのコードで、私のような何かをしたいですか? aliasは私の本当の選択ですか?私が行方不明のいくつかのより良い方法がありますか? class_eval以外のもの?

答えて

1

エイリアスは本当のオプションですか?

はい、クラスを開いて直接変更したい場合。しかし、より良い選択肢はであり、サードパーティのクラスを開けてサルのパッチを当てるのではなく、です。継承、または合成のいずれかを使用する必要があります。AwesomeClassのインスタンスをラップする独自のクラスを作成し、AwesomeClassメソッドを呼び出す独自のcool_methodと、必要な追加機能を提供します。

+0

宝石が「AwesomeClass」だけを望んでいて、自分のものではないとすれば、それはどのように働くのでしょうか? –

+1

@DanielBoganそして、GemはRubyのタイプシステムが動作する方法ではないので、間違って構築されています。オブジェクトが 'AwesomeClass'と同じメソッド呼び出しをサポートしている限り、宝石はそれを拒否できません。 – meagar

+0

ええ、それは理にかなっています。さて、ラド、ありがとう! –