有人能告诉我类变量和类实例变量之间的区别吗?

推荐答案

类变量(@@)在类及其所有子类之间共享.类实例变量(@)不被类的子体共享.


Class variable (100)

让我们有一个类Foo和一个类变量@@i,以及读写@@i的访问器:

class Foo

  @@i = 1

  def self.i
    @@i
  end

  def self.i=(value)
    @@i = value
  end

end

以及派生类:

class Bar < Foo
end

我们看到Foo和Bar对于@@i有相同的值:

p Foo.i    # => 1
p Bar.i    # => 1

一个改变@@i个,两个都会改变:

Bar.i = 2
p Foo.i    # => 2
p Bar.i    # => 2

Class instance variable (100)

让我们用类实例变量@i和读写访问器@i创建一个简单的类:

class Foo

  @i = 1

  def self.i
    @i
  end

  def self.i=(value)
    @i = value
  end

end

以及派生类:

class Bar < Foo
end

我们看到,尽管Bar继承了@i的访问器,但它本身并没有继承@i:

p Foo.i    # => 1
p Bar.i    # => nil

我们可以在不影响Foo's @i的情况下设置Bar's @i:

Bar.i = 2
p Foo.i    # => 1
p Bar.i    # => 2

Ruby相关问答推荐

Ruby插值法导致无序输出

ruby 中嵌套哈希中相同键的平均值

安全导航运算符的使用是否应该在两种情况下进行单元测试(对象存在 + 对象无)?

当数据包含换行符时,Ruby PKCS7 无法验证

如何返回此 OOP Ruby 代码最后一行中的变量?

如何在 rspec 中使用 `eq` 匹配器和 `hash_include` 匹配器来获取哈希数组

如何在加载文件时禁用重新定义常量的警告

确保 Capybara 不存在元素

如何从 Ruby 中的线程返回值?

判断文件是否包含字符串

有效的Electron邮件地址正则表达式?

使用 Ruby MiniTest 之前/之后的套件

如何在 ruby​​ rake 中明确地失败任务?

在 Ruby 中定义 [方括号] 方法是如何工作的?

从 Ruby 中的 URL 获取文件名的好方法是什么?

如何通过反射获得活动记录关联

通过 x 个字符在 Ruby 中获取子字符串

如何让 Ruby 1.9 成为 Ubuntu 上的默认 Ruby?

将 lambda 作为块传递

如何在 gemspec 中指定最低 Ruby 版本?