449

私は Java から来ましたが、今は Ruby を使っています。

私がよく知らない言語機能の 1 つは、module. a とは正確には何なのか、いつ使用するのmoduleか、なぜ a よりも a を使用するのmoduleか疑問に思っていますclass

4

9 に答える 9

525
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ class                     ║ module                          ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated       ║ can *not* be instantiated       ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage         ║ object creation           ║ mixin facility. provide         ║
║               ║                           ║   a namespace.                  ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass    ║ module                    ║ object                          ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods       ║ class methods and         ║ module methods and              ║
║               ║   instance methods        ║   instance methods              ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance   ║ inherits behaviour and can║ No inheritance                  ║
║               ║   be base for inheritance ║                                 ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion     ║ cannot be included        ║ can be included in classes and  ║
║               ║                           ║   modules by using the include  ║
║               ║                           ║   command (includes all         ║
║               ║                           ║   instance methods as instance  ║
║               ║                           ║   methods in a class/module)    ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension     ║ can not extend with       ║ module can extend instance by   ║
║               ║   extend command          ║   using extend command (extends ║
║               ║   (only with inheritance) ║   given instance with singleton ║
║               ║                           ║   methods from module)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
于 2012-03-19T21:12:07.913 に答える
416

最初の答えは適切で、いくつかの構造的な答えが得られますが、もう 1 つのアプローチは、自分が何をしているのかを考えることです。モジュールとは、複数のクラスで使用できるメソッドを提供することです。モジュールを「ライブラリ」と考えてください (Rails アプリで見られるように)。クラスはオブジェクトに関するものです。モジュールは機能に関するものです。

たとえば、認証および認可システムはモジュールの良い例です。認証システムは複数のアプリ レベルのクラス (ユーザーが認証され、セッションが認証を管理し、他の多くのクラスは認証状態に基づいて異なる動作をします) で機能するため、認証システムは共有 API として機能します。

複数のアプリでメソッドを共有している場合にも、モジュールを使用できます (ここでもライブラリ モデルが適しています)。

于 2008-09-30T04:38:39.620 に答える
97

まだ誰もこれを言っていないことに驚いています。

質問者は Java のバックグラウンドを持っているので (そして私もそうでした)、ここで役立つ類推があります。

クラスは単純に Java クラスに似ています。

モジュールは、Java の静的クラスに似ています。MathJava のクラスについて考えてみましょう。インスタンス化せず、静的クラスのメソッドを再利用します (例: Math.random())。

于 2013-08-08T19:28:29.620 に答える
41

基本的に、モジュールはインスタンス化できません。クラスにモジュールが含まれている場合、すべてのモジュール メソッドとクラス メソッドへのアクセスを提供するプロキシ スーパークラスが生成されます。

モジュールは複数のクラスに含めることができます。モジュールは継承できませんが、この「ミックスイン」モデルは便利なタイプの「多重継承」を提供します。OO の純粋主義者はその意見に同意しませんが、純粋さによって仕事を成し遂げることができないようにしてはなりません。


(この回答はもともと にリンクされていましhttp://www.rubycentral.com/pickaxe/classes.htmlたが、そのリンクとそのドメインはアクティブではなくなりました。)

于 2008-09-30T02:21:56.783 に答える
8

ModuleRuby では、ある程度、Java抽象クラスに対応します。インスタンス メソッドがあり、クラスはそれから継承できます ( includeRuby では「ミックスイン」と呼ばれます)。ただし、インスタンスはありません。他にも小さな違いがありますが、これだけの情報で十分です。

于 2013-06-10T15:23:13.757 に答える