Array.new([size[, val]])
请注意,初始化数组时所使用的初始化值并不是val的拷贝。如下所示,数组中所有的元素都指向同一个对象。
ary = Array.new(3, "foo")
p ary # => ["foo", "foo", "foo"]
ary.each {|v| p v.id}
# => 537713734
537713734
537713734
所以,如果您破坏性地修改了其中任何一个元素的话,所有的元素都会改变。
ary = Array.new(3, "foo") ary[0].replace "bar" p ary # => ["bar", "bar", "bar"]
为避免发生这种情况,您可以这样处理。
ary = Array.new(3).collect { "foo" }
ary[0].replace "bar"
p ary
# => ["bar", "foo", "foo"]
ruby 1.7 特性: 在version 1.7中,您可以使用块来解决这个问题。
ary = Array.new(3) { "foo" }
p ary # => ["foo", "foo", "foo"]
ary.each {|v| p v.id}
# => 537770556
537770436
537770424
self * times
与Array.new相同。
ary = ["foo"] * 3 ary[0].replace "bar" p ary # => ["bar", "bar", "bar"]
Array#fill(val)
与Array.new相同。
ary = Array.new(3).fill("foo")
ary[0].replace "bar"
p ary
# => ["bar", "bar", "bar"]
ruby 1.7 特性: 与Array.new一样,您可以使用块来解决这个问题。
ary = Array.new(3).fill { "foo" }
ary[0].replace "bar"
p ary
# => ["bar", "foo", "foo"]
Array#<=>
虽然Array拥有<=>方法,但它并不是Comparable。 ([ruby-list:18470],[ruby-dev:8261],[ruby-dev:2173])
Array#uniq
如果您把尚未重定义hash方法和eql?的类中的对象当作数组元素的话,那么数组元素的个数可能并不会减少。
[Hash.new, Hash.new].uniq #=> [{}, {}]