我会注意到,有很多措辞相似的问题与我认为我要问的问题不同。
以下在功能方面有什么区别?例如,他们在继承方面表现如何?
class Foo
BAR = 'Hello'
end
Run Code Online (Sandbox Code Playgroud)
和
class Foo
@bar = 'Hello'
end
Run Code Online (Sandbox Code Playgroud)
默认情况下,常量是公共的(我们在这里忽略私有常量)。如果没有 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)