Ruby 中的类常量和类实例变量有什么区别?

pix*_*aki 1 ruby inheritance

我会注意到,有很多措辞相似的问题与我认为我要问的问题不同。

以下在功能方面有什么区别?例如,他们在继承方面表现如何?

class Foo
  BAR = 'Hello'
end
Run Code Online (Sandbox Code Playgroud)

class Foo
  @bar = 'Hello'
end
Run Code Online (Sandbox Code Playgroud)

pix*_*aki 5

使用权

默认情况下,常量是公共的(我们在这里忽略私有常量)。如果没有 reader 和/或 writer 方法,则无法访问类实例变量(除了像 之类的东西Object#instance_variable_get,但这通常不是很好的风格)。

遗产

常量将引用它们使用的上下文中的值,而不是 的当前值self。例如,

class Foo
  BAR = 'Parent'

  def self.speak
    puts BAR
  end
end

class FooChild < Foo
  BAR = 'Child'
end

Foo.speak # Parent
FooChild.speak # Parent
Run Code Online (Sandbox Code Playgroud)

虽然类实例变量取决于 的值self

class Foo
  @bar = 'Parent'

  def self.speak
    puts @bar
  end
end

class FooChild < Foo
  @bar = 'Child'
end

Foo.speak # Parent
FooChild.speak # Child
Run Code Online (Sandbox Code Playgroud)

如果您使用对 的显式引用self,则可以获得与常量相同的行为,但是:

class Foo
  BAR = 'Parent'

  def self.speak
    puts self::BAR
  end
end

class FooChild < Foo
  BAR = 'Child'
end

Foo.speak # Parent
FooChild.speak # Child
Run Code Online (Sandbox Code Playgroud)

  • @MaxFriederichs 常量可以重新定义。你得到的只是一个警告,例如尝试这个“String = Integer” (2认同)