我刚刚了解了php中的静态变量。红宝石中有类似的东西吗?
例如,如果我们要创建一个Student
类,并且为student
我们创建的每个对象,则其ID号应自动递增。
我以为创建类变量是静态的。
我刚刚了解了php中的静态变量。红宝石中有类似的东西吗?
例如,如果我们要创建一个Student
类,并且为student
我们创建的每个对象,则其ID号应自动递增。
我以为创建类变量是静态的。
Answers:
类变量在所有实例之间共享(这就是为什么它们被称为类变量的原因),因此它们将执行您想要的操作。它们也被继承,有时会导致相当混乱的行为,但是我认为这不会成为问题。这是一个使用类变量来计算创建了多少实例的类的示例:
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
@@foos = 0
是与其他两个变量不同的变量,它的a是类的类变量Class
(Foo是Class类的实例),如果更正,我将删除downvote 。
class Foo; @@foo = "foo" end
设置class变量@@foo
。尝试:class Foo; @@foo = 1 end; class Object; @@foo end
将产生一个NameError: uninitialized class variable @@foo in Class
。
使用公认的答案作为静态变量的定义可能很危险,这是我在许多Ruby代码中都看到的常见错误。
@@foos
在所有子类之间共享类似的东西。但是,大多数程序员希望静态变量仅在定义它们的类中具有作用域。
如果您正在寻找大多数语言意义上的静态变量,它们的作用域只是它们自己的类,请查看此SO答案
此外,此博客文章还提供了一个很好的例子,说明大多数程序员会感到惊讶:
http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/