【问题标题】:static variables in ruby红宝石中的静态变量
【发布时间】:2011-01-25 20:38:25
【问题描述】:

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

例如,如果我们要创建一个Student 类,并且对于我们创建的每个student 对象,它的id 编号应该自动递增。

我认为将类变量创建为静态变量就可以了。

【问题讨论】:

标签: ruby


【解决方案1】:

类变量在所有实例之间共享(这就是它们被称为类变量的原因),所以它们会做你想做的事。它们也是继承的,有时会导致相当混乱的行为,但我认为这不是问题。下面是一个使用类变量来计算已创建的实例数量的类示例:

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 您的示例有一个缺点,来自@@foos = 0 的 foos 与其他两个变量不同,它是 Class 类的类变量(Foo 是class Class),如果您更正它,我将删除反对票。
  • @clyfe:你错了。您将类变量与实例变量混淆了。执行class Foo; @@foo = "foo" end 将类变量@@foo 设置为Foo,而不是Class。试试看:class Foo; @@foo = 1 end; class Object; @@foo end 将产生一个NameError: uninitialized class variable @@foo in Class
  • @khellll:不是不可预测的,出乎意料的。类变量的行为是完全确定的。
  • @khell:怎么样?我已经提到类变量是继承的。我还说过,这会导致令人困惑的行为。每次运行时,此代码仍将返回相同的结果。即使你没有提到它返回 2,我也会知道它在不运行它的情况下返回 2,所以很明显它是确定性的。
【解决方案2】:

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

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

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

此外,这篇博文还有一个很好的例子,说明大多数程序员都会得到惊喜:

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

【讨论】:

  • 事实上,你会惊讶于有多少人抱有误解,期望在其他语言的所有子类之间共享静态:P
猜你喜欢
  • 2017-04-01
  • 1970-01-01
  • 2010-09-28
  • 2013-09-20
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
相关资源
最近更新 更多