Ruby类变量是不是很糟糕?

时间:2015-11-17 16:39:28

标签: ruby singleton

当我实现" / singleton类型模式的"实例时,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方面来说,实现相同的目标,以确保只有一个实例?

2 个答案:

答案 0 :(得分:5)

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章,其中详细介绍了这一主题。

答案 1 :(得分:-1)

Ruby类变量是不是很糟糕?像任何主观问题一样,它取决于你的观点。关于全局变量主题的广泛文献中,单例类本质上是一种形式。能够在调用中隐藏的方法中调用包含状态的东西往往会使理解困难并且维护成为问题。

对于Ruby-1.9.3及更高版本,请参阅文档以获得更好的方法:

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

用你正在运行的任何Ruby版本替换-2.2.3。

基本上:

用法↑

To use Singleton, include the module in your class.

class Klass
   include Singleton
   # ...
end

单身人士不好吗?好吧,自2004年以来,我一直在使用红宝石,我只记得有一次我甚至考虑使用单身人士。我不记得细节,所以我推断我实际上并没有这样做。对单身人士的需求通常表明你正在解决的问题需要以更清晰的方式重新制定。