我有这个数组,我想复制并更改元素的值。我该怎么办(Ruby 1.9.3p429)
a = Array.new(2,"test") #a => ["test","test"] #a.object_id => 21519600 #a[0].object_id => 21519612
b = a.clone #b => ["test","test"] #b.object_id => 22940520 #b[0].object_id => 21519612
c = a.dup #c => ["test","test"] #c.object_id => 22865176 #c[0].object_id => 21519612
d = Array.new(a) #d => ["test","test"] #c.object_id => 23179224 #d[0].object_id => 21519612
c[0].upcase! #produces #a => ["TEST","TEST"], #b => ["TEST","TEST"], #c => ["TEST","TEST"] ...`
答案 0 :(得分:2)
在Ruby中,每个对象实际上都是对象的引用,所以如果你有数组
x = [a, b, c, d]
并将其复制到另一个数组
y = x.clone
它会复制对原始对象的引用,而不是对象本身。
要完全按照自己的意愿行事,你必须在循环中复制对象,但是你太专注于如何你希望实现阵列复制,而不是实现你的最终目标,得到一个新数组,由原始数组的upxased项组成。
探索Enumerable模块,您会发现#map
,#select
,#inject
等内容。例如,这是您获取所有名称为upcased的数组副本的方法:< / p>
["test", "test"].map { |element| element.upcase }
答案 1 :(得分:0)
从您的评论中,您似乎只想大写“c[0]
”。我不明白为什么你需要通过a
的副本来大写,但这里是如何做到的。
a = Array.new(2){"test"}
c = a.dup
c[0].upcase!
a # => ["TEST", "test"]