为什么ruby常量是可变的?变量之间的区别是什么?

为什么ruby常量是可变的?变量之间的区别是什么?,ruby,constants,Ruby,Constants,我在学习ruby,我知道ruby常量必须以大写字母开头(例如Myconstant)。这将使其成为常数,但其值是可变的 如果一个常数的值是可变的,那么为什么我们需要常数,变量之间的区别是什么呢?Ruby可以让你自食其果(如果你真的想要的话)。但是,至少在这种情况下,它会警告你 ONE = 'one' ONE = 'two' # !> already initialized constant ONE 一些原因: 1) 惯例。很容易从标识符的名称看出它不应该更改 2) 技术的。它(可能;比我更

我在学习ruby,我知道ruby常量必须以大写字母开头(例如Myconstant)。这将使其成为常数,但其值是可变的


如果一个常数的值是可变的,那么为什么我们需要常数,变量之间的区别是什么呢?

Ruby可以让你自食其果(如果你真的想要的话)。但是,至少在这种情况下,它会警告你

ONE = 'one'
ONE = 'two' # !> already initialized constant ONE
一些原因:

1) 惯例。很容易从标识符的名称看出它不应该更改

2) 技术的。它(可能;比我更有知识的人可能会回答)使口译员更简单


3) 活力有时是有益的;例如,在测试中,可以为测试目的重新定义事物,而不必存根/代理一切…

常量具有词法范围,而方法具有动态范围:

class Super
  Constant = "Super::Constant"

  def method
    'Super#method'
  end

  def get_constant
    Constant
  end

  def get_method
    method
  end
end

class Sub < Super
  Constant = 'Sub::Constant'

  def method
    'Sub#method'
  end
end

Super.new.get_constant # => "Super::Constant"
Sub.new.get_constant   # => "Super::Constant"

Super.new.get_method # => "Super#method"
Sub.new.get_method   # => "Sub#method"

另外,在Ruby中你可以做很多事情,但是为了你自己的理智,要小心。我建议不要随意更改常量,这可能会让您的团队感到沮丧。

我有时会在没有其他必要参数的情况下使用此功能来测试代码,例如在编辑器中运行脚本时,很难提供参数

#ARGV[0] = "c:/test.txt"  #in case of testing i remove the first remark sign

谢谢你的简单解释。常量应该是可变的,有什么原因吗?如果它是可变的,那么为什么称它为常数(名称不明确)?我想不出一个特别好的,但我也想不出一个理由,使它不能改变它们。一般来说,它们是常量,因为这就是我们对待它们的方式,它们的行为方式假设了这一点。但是如果你最终陷入了一个需要破解某些东西的境地,那么让语言阻止你会有多沮丧呢?
#ARGV[0] = "c:/test.txt"  #in case of testing i remove the first remark sign