0

是否有理由不使用 @var 或 @@var 在 Ruby 模块中,该模块不是注定要用作类中的 mixin?我已经进行了实验,两个变量都导致了相同的行为(简单的模块,基本上是 @var 或 @@var 的 getter 和 setter)。我还没有找到一个例子或解释说一个模块可以与一些可变状态一起使用。它几乎似乎在 java 中充当单例。

我发现了一段使用 @@vars 的代码,它从来没有在任何其他类中包含/扩展 - 所以基本上开发人员正在使用模块来保存一些可能会更新但希望模块的所有消费者的状态在任何给定时间看到相同的状态,我想我可以看到一些有价值的案例,但由于我从未见过任何记录在案的案例,我觉得这很奇怪。

无论如何,在模块的上下文中实例 @var 与“类”@@var 有什么区别吗?

编辑:

所以我做了更多的实验。所以我上面的问题是假设没有使用 mixins。这基本上说有一个类变量用于所有.....模块的一个实例(再次有点像单例),或者你有一个在所有实例之间共享的实例变量......模块的一个实例,因此使用for state 会导致相同的行为。但是,我创建了一个实例方法,它基本上是一个实例 getter,与我的模块方法 getter 一起使用,并在一个类中做了一个混合。对于@@var,单个模块实例和所有类共享它设置的值。使用@var,单个“模块实例”有它自己的值,然后为mixin 实例方法设置@var 的每个类实例都有它自己的@var。

我想这是有道理的。

4

1 回答 1

0

如果模块不包含在类中,我认为没有任何区别。类的实例变量和类变量之间的区别是:

  • 类变量在子类之间共享。如果A是 的子类B,则@@fooof与 ofA是同一对象,但of与@@fooof不同。B@fooA@fooB
  • 类变量在类及其所有实例之间共享。如果a,b是 的实例A,则@@fooof与of和ofA是同一个对象,但of 、of和of是不同的。@@fooa@@foob@fooA@fooa@foob

这两者都与不包含在类中的模块无关。

但是由于使用类变量可能意味着在子类之间和/或类和/或其实例之间存在这种共享,为了清楚起见,使用类的实例变量而不是类变量可能更好。

于 2013-05-14T00:54:43.573 回答