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

标签 ruby inheritance

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

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

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/

相关文章:

ruby-on-rails - 将 Rails 应用程序环境公开给 Ruby 脚本

ruby - Python 的 iter()/next() 在 Ruby 中的等价物是什么?

javascript - 相当于使用 __proto__?

javascript - MyClass.prototype = new Object() 和 MyClass.prototype = Object 的区别

c++ - 在C++中,是否允许强制转换为仅添加非虚方法的派生类?

ios - Flutter 调试 : Warning: CocoaPods not installed. 跳过 pod 安装

ruby - 找出 10 以下的 3 或 5 的倍数

ruby - 如何卡住 ruby​​-gnuplot 中的轴范围,并在卡住图的顶部绘制?

javascript - 有没有办法子类化/继承/扩展 javascript WebSocket?

c# - 用模板覆盖基类的抽象类