假设我在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搜索了,但一无所获。
这个的应用是我有大的字符串数组,我“重复”以创建它们的历史。现在我想对整个历史应用一个更改,而不是对这些更改进行双重应用(或三重等)。
答案 0 :(得分:1)
我不明白你的用例;我怀疑你的事情比他们需要的更复杂。
有没有办法测试内存中两个字符串是否相同?
Object#object_id
正是您要找的。 p>
有没有办法修改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"]
但是,这对我来说似乎有点疯狂。同样,我认为可能有更好的方法来做你想做的事情,但很难根据所提供的信息来判断。