1

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

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

这里,b 是 a 的浅拷贝。所以如果我这样做:

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

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

b[1] = "blueberry"

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

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

我尝试创建一个包含所有字符串的集合,以便每个字符串都是唯一的;但似乎集合创建复制了字符串,因此无法就地修改它们。有没有办法测试两个字符串在内存中是否相同?我已经用谷歌搜索了,但什么也没找到。

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

4

1 回答 1

1

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

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

Object#object_id就是你要找的。

有没有办法在不重复的情况下修改 a 和 b 的所有字符串?

您可以保留一组并非所有的object_ids,类似于您已经尝试过的。您可以使用 检索字符串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"]

不过,这对我来说似乎有点疯狂。同样,我认为可能有更好的方法来做你想做的事情,但根据提供的信息很难判断。

于 2013-04-25T16:12:50.747 回答