红宝石中的静态变量


70

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

例如,如果我们要创建一个Student类,并且为student我们创建的每个对象,则其ID号应自动递增。

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


@Andrew没有提及存在任何数据库。
2011年

@Oddmund我认为这就是OP想要一个ID号的原因。
Andrew Grimm

Answers:


109

类变量在所有实例之间共享(这就是为什么它们被称为类变量的原因),因此它们将执行您想要的操作。它们也被继承,有时会导致相当混乱的行为,但是我认为这不会成为问题。这是一个使用类变量来计算创建了多少实例的类的示例:

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

由于man..I做了一件愚蠢的在我的代码,并完全误解的概念....
levirg

-1您的示例有一个缺点,foos from@@foos = 0是与其他两个变量不同的变量,它的a是类的类变量Class(Foo是Class类的实例),如果更正,我将删除downvote 。
clyfe

6
@clyfe:你错了。您正在将类变量与实例变量混淆。这样做会为Foo(而非Class)class Foo; @@foo = "foo" end设置class变量@@foo。尝试:class Foo; @@foo = 1 end; class Object; @@foo end将产生一个NameError: uninitialized class variable @@foo in Class
sepp2k 2010年

2
@khelll:并非不可预料,出乎意料。类变量的行为是完全确定的。
sepp2k 2010年

1
@khell:那呢?我已经提到过类变量是继承的。我还说过,这会导致混乱的行为。尽管如此,每次运行该代码仍将返回相同的结果。即使您没有提到它返回2,我也会知道它不运行就返回2,所以很明显它是确定性的。
sepp2k 2010年

15

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

@@foos所有子类之间共享类似的东西。但是,大多数程序员希望静态变量在定义它们的类中具有作用域。

如果您正在寻找大多数语言意义上的静态变量,它们的作用域只是它们自己的类,请查看此SO答案

此外,此博客文章还提供了一个很好的例子,说明大多数程序员会感到惊讶:

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


3
实际上,您会对误解的人数感到惊讶,因为他们期望在其他语言的所有子类中共享静态:P
Rael Gugelmin Cunha 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.