2

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

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

4

4 回答 4

2

Ruby 让你在脚下开枪(如果你真的想的话)。但是,至少在这种情况下,它会警告您。

ONE = 'one'
ONE = 'two' # !> already initialized constant ONE
于 2012-07-25T04:57:55.160 回答
2

一些原因:

1) 公约。仅从标识符的名称就很容易看出它不应该更改。

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

3) 活力有时是有帮助的;例如,在测试中,可以出于测试目的重新定义事物,而不必对所有内容进行存根/代理……</p>

于 2012-07-25T04:58:51.747 回答
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 中做很多事情,但是为了你自己的理智,要小心。我建议不要更改常量,这可能会使您的团队感到沮丧。

于 2012-07-25T06:06:07.940 回答
1

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

#ARGV[0] = "c:/test.txt"  #in case of testing i remove the first remark sign
于 2012-07-25T11:29:57.677 回答