Ruby类变量有问题吗?

8
当我实现“实例/单例”类型模式时,RubyMine通知使用类变量被认为是不好的方式。
我发现的唯一信息是使用类变量可能会使继承有些混乱。是否还有其他原因,导致以下代码会给我带来问题?
class Settings
  private_class_method :new
  attr_accessor :prop1
  attr_accessor :prop2

  @@instance = nil

  def Settings.instance_of
    @@instance = new unless @@instance
    @@instance
  end
  def initialize
    @prop2 = "random"
  end
end

此外,从 Ruby 的角度来看,是否有更好的方法来实现同样的目标,以确保只有一个实例?

你的方法 Settings.instance_of 的主体可以简化为 @@instance ||= new - sawa
1
你在这里问了两个不同的问题:(1)类变量的使用是否不好(你的问题标题)?和(2)如何创建单实例类(你的问题内容)?我引用了一个处理单实例想法的链接。但是你所拥有的并不是类变量使用的坏例子,它们并不总是不好的。它们只是大多数时候被滥用。我不会把你的例子归类为“滥用”。:) 另一个相关的类变量使用示例可能是实例计数。 - lurker
这篇来自 Practicing Ruby 的文章 Ruby and the singleton pattern don't get along 对我来说是一份非常宝贵的参考资料。 - Frank Joseph Mattia
哇,感谢你们的反馈,而且速度这么快。我会阅读链接的内容。同时也感谢 @lurker 提供的详细信息。 - randall
还有针对优化方面的建议,@sawa :-) - randall
2个回答

7
在Ruby中,类变量的问题在于当你从一个类继承时,新的类不会获得自己的类变量副本,而是使用了从其父类继承来的同一个变量。
例如:
class Car
  @@default_max_speed = 100
  def self.default_max_speed
    @@default_max_speed
  end
end

class SuperCar < Car
  @@default_max_speed = 200 # and all cars in the world become turbo-charged
end

SuperCar.default_max_speed # returns 200, makes sense!
Car.default_max_speed # returns 200, oops!

推荐使用类实例变量(请记住,Ruby中的类只是Class类的对象)。我强烈建议阅读Russ Olsen的Eloquent Ruby第14章,该章节详细介绍了此主题。

谢谢您的反馈。这基本上是我在研究中发现的,但这是一个很好的简洁描述。 - randall

-2
Ruby类变量是不好的吗?像任何主观问题一样,这取决于您的观点。有关全局变量的广泛文献,其中单例类本质上是一种形式。在方法中调用包含状态的东西,而在调用中不可见,往往会使理解事物变得困难,并且维护也会出现问题。
对于Ruby-1.9.3及更高版本,请参阅更好的方式的文档:

http://ruby-doc.org/stdlib-2.2.3/libdoc/singleton/rdoc/Singleton.html

将-2.2.3替换为您正在运行的Ruby版本。

基本上:

用法¶ ↑

To use Singleton, include the module in your class.

class Klass
   include Singleton
   # ...
end

单例模式是不好的吗?自2004年以来,我一直在使用Ruby,我只能回想起一次我甚至考虑使用单例模式的场合。而且我也无法回忆起细节,因此我推断我实际上并没有这样做。需要使用单例模式通常意味着您解决的问题需要在更清晰的公式化中重新构建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接