从我读到的ARGV应该是一个常量,因为它全部是大写字母,但是我能够编写一个快速程序,在ARGV中更改其中一个值而不会出错。那么什么类型的变量是ARGV?红宝石中的ARGV是一种什么样的变量?
p ARGV
ARGV[0] = "Not the orginal"
p ARGV
从我读到的ARGV应该是一个常量,因为它全部是大写字母,但是我能够编写一个快速程序,在ARGV中更改其中一个值而不会出错。那么什么类型的变量是ARGV?红宝石中的ARGV是一种什么样的变量?
p ARGV
ARGV[0] = "Not the orginal"
p ARGV
ARGV是一个常量,但它是一个数组。常量数组中的值可以随意更改,不会有任何警告,就像任何常见的数组元素一样。
irb(main)> ARGV.class
=> Array
irb(main)> QWERTY = [1, 2, 3, 4]
=> [1, 2, 3, 4]
irb(main)> QWERTY[1] = 5
=> 5
irb(main)> QWERTY
=> [1, 5, 3, 4]
irb(main)> QWERTY << 6
=> [1, 5, 3, 4, 6]
irb(main)> QWERTY = 3
(irb): warning: already initialized constant QWERTY
=> 3
ARGV是一个数组。请记住,“常量”意味着变量不应该被重新分配,而不是对象本身不能改变。您可能会将它与C++中const
对象的想法混淆起来。这更类似于Ruby中的冻结对象。 (注意,即使“常量不应该被重新分配”也是Ruby中的一个弱保证,重新分配一个常量不会失败;它只是打印一个警告,但这是一个不好的做法)
为了说明区别:
ruby-1.9.2-p0 > CONSTANT = [1,2,3]
=> [1, 2, 3]
ruby-1.9.2-p0 > frozen = [1,2,3].freeze
=> [1, 2, 3]
ruby-1.9.2-p0 > CONSTANT << 4
=> [1, 2, 3, 4]
ruby-1.9.2-p0 > frozen << 4
RuntimeError: can't modify frozen array
如果我没有犯错误,在C++中常量数组不会禁止它的元素编辑。它只是“冻结”数组开始指针。 – Nakilon 2010-10-23 05:45:59
纠正我,如果我错了。我有一段时间没有在C++中练习。 – Nakilon 2010-10-23 05:55:13
它的确如此。下面的代码不能编译:'const int a [1] = {0}; a [0] = 1;'。在一个对象的const实例中,你只能调用const方法,并且这些方法不允许改变对象内部的任何东西。 Const实际上比Ruby常量更能保证不变性。 const不做的是防止从外部触及相同的内存。例如,使用const_cast很容易。所以虽然const是一个非常强的句法范围,但它绝不是一个真正的不变性保证。 – Jean 2010-10-23 06:02:56
愚蠢的我很有道理。我猜现在事情已经很晚了。 – Anton 2010-10-23 05:42:54