Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中ARGV是什么类型的变量?_Ruby_Command Line_Arguments - Fatal编程技术网

在ruby中ARGV是什么类型的变量?

在ruby中ARGV是什么类型的变量?,ruby,command-line,arguments,Ruby,Command Line,Arguments,从我读到的内容来看,ARGV应该是一个常量,因为它都是大写的,但是我能够编写一个快速的程序来更改ARGV中的一个值,并且没有错误。那么ARGV是什么类型的变量呢 p ARGV ARGV[0] = "Not the orginal" p ARGV ARGV是一个常量,但它是一个数组。常量数组中的值可以在没有任何警告的情况下自由更改,就像任何常规数组元素一样 irb(main)> ARGV.class => Array irb(main)> QWERTY = [1, 2, 3,

从我读到的内容来看,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
irb(main)>ARGV.class
=>阵列
irb(主要)>QWERTY=[1,2,3,4]
=> [1, 2, 3, 4]
irb(主要)>QWERTY[1]=5
=> 5
irb(主要)>QWERTY
=> [1, 5, 3, 4]
irb(主要)>QWERTY[1,5,3,4,6]
irb(主要)>QWERTY=3
(irb):警告:已初始化常量QWERTY
=> 3

ARGV是一个数组。请记住,“常量”只是意味着不应该重新分配变量,而不是对象本身不能更改。您可能会混淆C++中的代码> const < /Cord>对象的概念。这更等同于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
ruby-1.9.2-p0>常数=[1,2,3]
=> [1, 2, 3] 
ruby-1.9.2-p0>冻结=[1,2,3]。冻结
=> [1, 2, 3] 
ruby-1.9.2-p0>常数[1,2,3,4]

ruby-1.9.2-p0>冻结愚蠢的我,这很有道理。我想现在事情已经开始变慢了。如果我没有犯错误,在C++中,常数数组不允许它编辑元素。它只是“冻结”数组起始指针。如果我错了,请纠正我。我在C++中没有练习过一段时间。以下代码未编译:
constinta[1]={0};a[0]=1。在对象的const实例上,只能调用const方法,而这些方法不允许更改对象内部的任何内容。Const实际上比Ruby常量更能保证不变性。const不做的是防止从外部接触相同的内存。例如,使用const_cast很容易。因此,尽管const是一个非常强大的语法屏障,但它也绝不是真正的不变性保证。