红宝石中的ARGV是什么样的变量?

Ant*_*ton 3 ruby command-line arguments

从我所读到的ARGV应该是一个常量,因为它全部是大写的,但我能够编写一个快速程序,改变了ARGV中的一个值而没有错误.那么什么类型的变量是ARGV?

p ARGV
ARGV[0] = "Not the orginal"
p ARGV
Run Code Online (Sandbox Code Playgroud)

Chu*_*uck 7

ARGV是一个阵列.请记住,"常量"只意味着不应该重新赋值变量,而不是对象本身不能更改.您可能会将它与constC++ 中的对象的想法混淆.这更像是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
Run Code Online (Sandbox Code Playgroud)


Nak*_*lon 6

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
Run Code Online (Sandbox Code Playgroud)