我正在学习ruby,我发现ruby常量必须以大写字母(例如Myconstant)开头。这将使它成为一个常数,但它的价值是可变的!为什么ruby常量是可变的?变量有什么区别?
如果一个常量的值是可变的,那么为什么我们需要常量,那么变量之间有什么区别呢?
我正在学习ruby,我发现ruby常量必须以大写字母(例如Myconstant)开头。这将使它成为一个常数,但它的价值是可变的!为什么ruby常量是可变的?变量有什么区别?
如果一个常量的值是可变的,那么为什么我们需要常量,那么变量之间有什么区别呢?
常量的词汇范围,而方法具有动态作用域:
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可以让你在脚下拍摄自己(如果你真的想的话)。但是,至少在这种情况下,它会警告你。
ONE = 'one'
ONE = 'two' # !> already initialized constant ONE
一些原因:
1)公约。从标识符的名称很容易看出它不应该改变。
2)技术。它(可能;比我更有见识的人可能会回答)让翻译更简单。
3)动态有时是有帮助的;在测试中,例如,有可能重新定义的东西用于测试目的,而不必存根/代理一切......
我有时候会使用这个特性来测试代码而没有其他必要的参数,例如,当我从我的编辑器中难以提供参数的脚本运行脚本时。
#ARGV[0] = "c:/test.txt" #in case of testing i remove the first remark sign
感谢您的简单解释。有什么理由不断改变?如果它是可变的,那么为什么称它为一个常量(名称不明确)? – 18bytes 2012-07-25 06:42:40
我想不出一个特别好的,但我也想不出一个理由让它变成你不能改变它们。一般来说,它们是常量,因为这就是我们对待它们的方式,而且它们的行为方式是假设的。但是如果你在需要破解某些东西的情况下解决了问题,那么让语言阻止你会有多沮丧? – 2012-07-25 06:58:15