假设我在ruby中创建了以下数组:
a = ["apple", "cherry"]
b = a.dup在这里,b是a的浅表副本,所以如果我这样做了:
a.each{|fruit| fruit << " pie"}我得到的a和b等于“苹果派”,“樱桃派”。那里没问题。但假设我改变了b的一个元素:
b[1] = "blueberry"发出同样的“每个”命令。现在b是“苹果派”,“蓝莓”,因为a和b是相同的字符串,但是a1和b1是不同的字符串。我可以在a和b上运行命令,但是b是“苹果派”、“蓝莓派”,因为我已经在同一个字符串上运行了两次附加操作。
有没有一种方法可以修改a和b的所有字符串,而不需要重复。在这个简单的例子中,我可以测试子字符串“饼”,但是这不能适用于其他类型的更改(比如删除第一个字符)。
我尝试创建一个包含所有字符串的集合,以便每个字符串都是唯一的;但是似乎集合创建复制了字符串,因此它们不能被修改到位。有没有一种方法来测试两个字符串在内存中是否相同?我在谷歌上搜索过,但什么也没找到。
它的应用是,我有大量的字符串,我用它来创建它们的历史记录。现在,我想对整个历史应用一个更改,而不是双重应用(或三重)更改。
发布于 2013-04-25 16:12:50
我不理解您的用例;我怀疑您正在使事情变得比他们需要的更复杂。
有没有一种方法来测试两个字符串在内存中是否相同?
Object#object_id是你要找的东西。
是否有一种方法可以修改a和b的所有字符串,而不需要重复?
您可以保留一组并非所有的object_id,类似于您已经尝试过的内容。您可以使用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"]不过,我觉得有点疯狂。同样,我认为可能有更好的方法来做你想做的事情,但根据所提供的信息很难判断。
https://stackoverflow.com/questions/16219365
复制相似问题