質問

私はRubyの上に読み取り、そのミックスインパターンについて学びましたが、(私が最も可能性が高いそのように考えることに慣れていないので)多くの有用なミックスインの機能を考えることができませんでした。だから私は便利なミックスインの機能の良い例だろうかと思った?

おかげ

編集:背景のビット。私は、C ++、およびその他のオブジェクト言語から来るんだけど、ここで私の疑問は、Rubyはそれがミックスインを継承していないと言うことですが、私は多重継承とミックスインを見続けるので、私は、私は私の快適ゾーンにもすぐにそれらを分類しようとしている恐れ、そして実際にミックスインが何であるかを完全に理解はない。

役に立ちましたか?

解決

私は思うまあいつもの例では、持続性のある

module Persistence
    def load sFileName
            puts "load code to read #{sFileName} contents into my_data"
    end
        def save sFileName
        puts "Uber code to persist #{@my_data} to #{sFileName}"
    end

end

class BrandNewClass
    include Persistence
    attr :my_data

        def data=(someData)
        @my_data = someData
    end
end

b = BrandNewClass.new
b.data = "My pwd"
b.save "MyFile.secret"
b.load "MyFile.secret"

モジュールがファイルにクラスの状態を持続するRubyの忍者、によって書かれて想像してみてください。
今、私はブランドの新しいクラスを書くと仮定し、私はinclude ModuleILikeを言ってそれを混合することにより、持続性の機能を再利用することができます。あなたも、実行時にモジュールを含めることができます。私は負荷を取得し、ちょうどそれを混合することにより、自由のための方法を保存します。これらのメソッドは、ちょうどあなたがあなたのクラスを自分で書いたもののようなものです。コード/行動/機能の再利用継承なし!

それでは、あなたがやっていることはあなたのクラスのメソッドテーブルにメソッド(文字通り正しいが、近接していない)を含むです。

他のヒント

これらは通常、それをすべて再定義しなくても、クラスに標準機能のいくつかのフォームを追加するために使用されています。 のモジュールを含むことによって実装されるあなたは、おそらくビットのJavaのインターフェイスのようにそれらを考えることができますが、その代わりに、単に実装する必要があるメソッドのリストを定義する、それらの多くは、実際にをします。

標準ライブラリのいくつかの例があります:

シングルトン - それシングルトンにするために、任意のクラスの中に混合することができるモジュール。 initializeメソッドがプライベート行われ、インスタンスメソッドは、アプリケーションでそのクラスのしかつのインスタンスがあることが保証され、追加しました。

匹敵する - あなたはクラスでは、このモジュール、別のオブジェクトと現在のインスタンスを比較して大きくなっていると言い、<、<=、==、> =提供するのに十分である<=>方法を、定義が含まれている場合、 >との間に?メソッドます。

列挙 - このモジュールで混合し、のそれぞれの方法を定義することにより、このような収集、注入し、選択し、拒否などの、他のすべての関連する方法をサポートし得ます。それはまた<=>方法を持っている場合、それはまた、ソート分をサポートし、最大ます。

DataMapperのもシンプルで何ができるかの興味深い例声明、標準クラスを取って、データストアに永続化する機能を追加などがあります。

ルビーでは、ミックスインは、多重継承ではないことの理由は、ミックスインの方法を組み合わせること1時間の事であるということです。これはRubyのモジュールとクラスが変更に開いていることを除いては、そのような大きな問題ではないでしょう。これは、あなたのクラスにモジュールをミックスインすると、その後、モジュールにメソッドを追加することを意味し、この方法は、あなたのクラスに使用することはできません。どこが逆の順序でそれをしなかった場合、それは希望ます。

これはアイスクリームコーンを注文するようなものです。あなたのミックスインとしてチョコレート振りかけるとタフィービットを取得し、あなたのコーンで歩いた場合、誰かが戻ってアイスクリームショップでチョコレート振りかけるビンに色とりどりの振りかけるを追加した場合、どのような種類のアイスクリームコーンのあなたが持っているでは変更されません。ミックスインモジュールは、振りかけるのビンがあるとき、あなたのクラス、アイスクリームコーンは、変更されません。そのミックスインモジュールを使用するには次の人が変更を確認します。

あなたはルビーでモジュールをincludeすると

、それはincluder 1時間にそのモジュールのメソッドのコピーを追加され、そのモジュールにModule#append_featuresを呼び出します。

多重継承、私はそれを理解し、より多くの代表団のようなものです。あなたのクラスは何かをする方法を知らない場合には、その親に尋ねます。クラスが作成された後、オープンクラスの環境では、クラスの親は変更されている可能性があります。

これは、RL親子関係のようなものです。あなたのお母さんはあなたが生まれた後に両立する方法を学んだかもしれないが、誰かが両立するように要求されますし、あなたはどちらかに彼女を頼む場合:あなたはどのように表示され(あなたがそれを必要なときにそれをコピー)、またはあなたのためにそれを行う(純粋な委任)、そして彼女「両立させるために彼女の能力だった前に作成された場合でも、その時点でことができるでしょう。

それはあなたが「を含む」ルビーのモジュールを変更することができincludersのリストを維持するためにModule#append_featuresを変更することで、多重継承のようにもっと行動し、その後、method_addedコールバックを使用してそれらを更新するが、これは、標準からの大きなシフトになることが可能ですルビー、およびその他のコードを扱うときに大きな問題を引き起こす可能性があります。あなたはより良いModule#inheritと呼ばれ、同様に委任を扱っincludeメソッドを作成することがあります。

現実世界の例としては、Enumerableは素晴らしいです。あなたが#eachを定義し、あなたのクラスでEnumerableが含まれている場合、それはあなたが一人一人をコーディングすることなく、あなたはイテレータの全体のホストにアクセスできます。

これは、主に一方がCで多重継承を使用するかもしれないとして使用++またはJava / C#でインタフェースを実装しています。あなたの経験はどこにあるのか私にはわからないんだけど、あなたが前にそれらの事を行っている場合は、ミックスインは、あなたがRubyでそれらを行うだろうかです。これは、クラスに機能を注入する体系方法です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top