为什么红宝石常数是可变的?变量有什么区别?

时间:2012-07-25 04:53:20

标签: ruby constants

我正在学习ruby,并且我了解到ruby常量必须以大写字母开头(例如Myconstant)。这将使它成为一个常数,但它的价值是可变的!

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

4 个答案:

答案 0 :(得分:2)

Ruby允许你在脚下射击(如果你真的想要)。但是,至少在这种情况下,它会警告你。

ONE = 'one'
ONE = 'two' # !> already initialized constant ONE

答案 1 :(得分:2)

一些原因:

1)公约。很容易从标识符的名称中看到它不应该改变。

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

3)活力有时是有帮助的;例如,在测试中,可以重新定义用于测试目的的东西,而不是必须存根/代理所有内容......

答案 2 :(得分:2)

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

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"

就变量而言,它们无法从外部进入。您打算如何访问这些?

class Object
  Constant      = 'constant'  
  local_var     = 'local var'
  @instance_var = 'instance var'
  @@class_var   = 'class var' # btw, never use these
end

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

答案 3 :(得分:1)

我有时使用此功能来测试代码而没有其他必要的参数,例如当我从编辑器运行脚本时很难提供参数。

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