0

クラスで mixin として使用される予定のない Ruby モジュールで @var または @@var を使用しない理由はありますか? 私が実験したところ、両方の変数が同じ動作になりました (基本的に @var または @@var の getter と setter を持つ単純なモジュール)。モジュールを可変状態で使用できるという例や説明は見つかりませんでした。Javaのシングルトンとして機能しているようです。

全体で @@vars を使用しているコードを見つけましたが、それは他のクラスでは決して include/extend されていなかったので、基本的に開発者はモジュールを使用して、更新される可能性のある状態を保持していましたが、モジュールのすべてのコンシューマーにいつでも同じ状態を見ることができ、これが価値のあるいくつかのケースを見ることができると思いますが、これについて文書化されたケースを見たことがないので、奇妙だと思いました.

とにかく、モジュールのコンテキストでインスタンス @var と「クラス」 @@var に違いはありますか?

編集:

そこで、もう少し実験してみました。したがって、上記の質問は、ミックスインを使用しないことを前提としていました。これは基本的に、モジュールのすべての...1つのインスタンス(これもシングルトンのようなもの)のクラス変数があるか、モジュールのすべての...1つのインスタンス間で共有されるインスタンス変数があるため、いずれかを使用することを示していますfor state は同じ動作になります。ただし、基本的にインスタンス ゲッターであるインスタンス メソッドを作成して、モジュール メソッド ゲッターと併用し、クラスを mixin しました。@@var の場合、単一のモジュール インスタンスとすべてのクラスが、設定された値を共有します。@var では、単一の「モジュール インスタンス」に独自の値があり、mixin インスタンス メソッドに @var を設定する各クラス インスタンスに独自の @var がありました。

これは一理あると思います。

4

1 に答える 1

0

モジュールがクラスに含まれていなくても、違いはないと思います。クラスのインスタンス変数とクラス変数の違いは次のとおりです。

  • クラス変数はサブクラス間で共有されます。Aが のサブクラスである場合B@@fooofAは of と同じオブジェクト@@fooですBが、@fooofはofAとは異なります。@fooB
  • クラス変数は、クラスとそのすべてのインスタンス間で共有されます。が のインスタンスである場合、aofはofおよびofと同じオブジェクトですが、of 、of 、およびofは異なります。bA@@fooA@@fooa@@foob@fooA@fooa@foob

これらはどちらも、クラスに含まれていないモジュールには関係ありません。

ただし、クラス変数の使用は、サブクラス間および/またはクラスおよび/またはそのインスタンス間でそのような共有があることを意味する可能性があるため、明確にするために、クラス変数ではなくクラスのインスタンス変数を使用する方がよい場合があります。

于 2013-05-14T00:54:43.573 に答える