Ruby类变量坏吗?

Ruby类变量坏吗?,ruby,singleton,Ruby,Singleton,当我实现一个“instance of”/singleton类型模式时,RubyMine通知说,使用类变量被认为是错误的形式 我遇到的唯一信息是,使用类变量会使继承变得有点松松垮垮。下面的代码会给我带来问题,还有其他原因吗 class Settings private_class_method :new attr_accessor :prop1 attr_accessor :prop2 @@instance = nil def Settings.instance_of

当我实现一个“instance of”/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方面,有没有更好的方法来实现相同的目标,以确保只有一个实例?

Ruby类变量不好吗?就像任何主观事物一样,它取决于你的观点。关于全局变量的主题有很多文献,其中单例类本质上是一种形式。能够调用方法中包含状态的内容,而这些内容在调用方法时是不可见的,这往往会使理解内容变得困难,维护也有问题

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

用运行的任何Ruby版本替换-2.2.3

基本上:

用法»↑

To use Singleton, include the module in your class.

class Klass
   include Singleton
   # ...
end

单身汉不好吗?自2004年以来,我一直在使用ruby,我只记得有一次我甚至考虑过使用singleton。我想不起细节,所以我推断我实际上没有这样做。对单例的需要通常是一个迹象,表明您正在解决的问题需要以更清晰的形式重新表述。

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!
等级车
@@默认最大速度=100
def self.default_max_速度
@@默认最大速度
结束
结束
超级跑车
@@默认的最大速度为200,世界上所有的汽车都是涡轮增压的
结束
SuperCar.default_max_speed#返回200,有意义!
Car.default_max_speed#返回200,哎呀!

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

方法的主体
设置可能重复。
的实例可以简化为
@@instance | |=new
。您在这里问了两个不同的问题:(1)类变量的使用不好吗(您的问题标题)?以及(2)如何创建单个实例类(您的问题内容)?我引用了一个链接来处理单一实例的想法。但是你所拥有的并不是一个使用类变量的坏例子,它们也并不总是坏的。他们大多数时候只是被虐待。我不会把你的例子归类为“虐待”。)另一个使用类变量的相关示例可能是实例计数。Practicing Ruby上的这篇文章对我来说是一个非常宝贵的参考。哇,感谢所有的反馈,而且非常快。我会仔细阅读链接。另外,感谢@Lourger提供的详细信息,感谢您的反馈。这几乎是我在研究中发现的,但这是一个很好的简洁描述。