如何制作数组的副本并在ruby中操作其元素

时间:2013-07-31 13:39:38

标签: ruby arrays

我有这个数组,我想复制并更改元素的值。我该怎么办(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"] ...`

2 个答案:

答案 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"]