ruby中的静态变量

lev*_*irg 68 ruby

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

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

我认为创建类变量作为静态会做.

sep*_*p2k 107

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

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
Run Code Online (Sandbox Code Playgroud)

  • @clyfe:你错了.您将类变量与实例变量混淆.做'Foo级; @@ foo ="foo"end`为Foo设置类变量`@@ foo`,而不是Class.试试看:`class Foo; @@ foo = 1结束; class Object; @@ foo end`将在Class中产生一个`NameError:uninitialized类变量@@ foo. (6认同)
  • @khelll:并非不可预测,出乎意料。类变量的行为是完全确定的。 (2认同)

Sys*_*ank 14

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

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

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

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

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

  • 实际上,你会对有误解的人数感到惊讶,他们希望在其他语言的所有子类之间共享静态:P (2认同)