改变ruby中浅层复制字符串数组的内容

时间:2013-04-25 15:52:38

标签: ruby arrays string shallow-copy

假设我在ruby中创建了以下数组:

a = ["apple", "cherry"]
b = a.dup

这里,b是a的浅表副本。所以,如果我这样做:

a.each{|fruit| fruit << " pie"}

我得到a和b等于[“apple pie”,“cherry pie”]。没问题。但是假设我改变了b的一个元素:

b[1] = "blueberry"

并发出相同的“each”命令。现在b是[“apple pie”,“blueberry”],因为[0]和b [0]是相同的字符串,但是[1]和b [1]是不同的字符串。我可以在a和b上运行命令,但是b是[“apple pie pie”,“blueberry pie”],因为我已经在同一个字符串上运行了两次附加操作。

有没有办法修改到位 a和b的所有字符串,没有重复。在这个简单的例子中,我可以测试子字符串“pie”,但这不适用于其他类型的更改(例如删除第一个字符)。

我尝试创建一个包含所有字符串的集合,这样每个字符串都是唯一的;但似乎集创建会复制字符串,因此无法对其进行修改。有没有办法测试内存中两个字符串是否相同?我已经用Google搜索了,但一无所获。

这个的应用是我有大的字符串数组,我“重复”以创建它们的历史。现在我想对整个历史应用一个更改,而不是对这些更改进行双重应用(或三重等)。

1 个答案:

答案 0 :(得分:1)

我不明白你的用例;我怀疑你的事情比他们需要的更复杂。

有没有办法测试内存中两个字符串是否相同?

Object#object_id正是您要找的。

有没有办法修改a和b的所有字符串,没有重复?

您可以保留一组并非所有object_id s,类似于您已尝试过的内容。您可以使用ObjectSpace#_id2ref检索字符串。像这样:

require 'set'

set = Set.new
a = ["apple", "cherry"]
b = a.dup
b[1] = "blueberry"

# Collect unique string objects
a.each{|s| set << s.object_id}
b.each{|s| set << s.object_id}

# Make pie with each unique string object
set.each{|id| ObjectSpace._id2ref(id) << " pie"}

a
# => ["apple pie", "cherry pie"]
b
# => ["apple pie", "blueberry pie"]
但是,这对我来说似乎有点疯狂。同样,我认为可能有更好的方法来做你想做的事情,但很难根据所提供的信息来判断。