ruby中的静态变量

时间:2010-03-10 11:18:35

标签: ruby

我刚学会了php中的静态变量。红宝石中有类似的东西吗?

例如,如果我们要创建一个Student类,并为我们创建的每个student对象创建一个,那么它的id号应该会自动增加。

我认为创建类变量是静态的。

2 个答案:

答案 0 :(得分:103)

类变量在所有实例之间共享(这就是它们被称为类变量的原因),因此它们可以执行您想要的操作。它们也是遗传的,有时会导致相当混乱的行为,但我认为这不会成为一个问题。下面是一个类的示例,该类使用类变量来计算已创建的实例数:

class Foo
  @@foos = 0

  def initialize
    @@foos += 1
  end

  def self.number_of_foos
    @@foos
  end
end

Foo.new
Foo.new
Foo.number_of_foos #=> 2

答案 1 :(得分:14)

使用接受的答案作为静态变量的定义可能很危险,这是我在很多Ruby代码中看到的常见错误。

@@foos这样的东西在 ALL 子类之间共享。但是,大多数程序员都希望静态变量在定义它们的类中具有范围

如果您正在寻找大多数语言意义上的静态变量,其范围只是他们自己的类,请查看this SO answer

此博客文章还有一个很好的例子,说明了大多数程序员会得到的惊喜:

http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/