我会注意到有很多措辞相似的问题与我认为我要问的问题截然不同。
以下在功能方面有什么区别?例如。他们在继承方面的表现如何?
class Foo
BAR = 'Hello'
end
和
class Foo
@bar = 'Hello'
end
最佳答案
访问
常量默认是公开的(我们在这里忽略 private constants)。如果没有读取器和/或写入器方法,则无法访问类实例变量(除了像 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
虽然类实例变量依赖于self
的值:
class Foo
@bar = 'Parent'
def self.speak
puts @bar
end
end
class FooChild < Foo
@bar = 'Child'
end
Foo.speak # Parent
FooChild.speak # Child
如果您使用对 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
关于ruby - Ruby 中的类常量和类实例变量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49288287/