首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改变红宝石中浅拷贝字符串数组的内容

改变红宝石中浅拷贝字符串数组的内容
EN

Stack Overflow用户
提问于 2013-04-25 15:52:37
回答 1查看 130关注 0票数 1

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

代码语言:javascript
复制
a = ["apple", "cherry"]
b = a.dup

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

代码语言:javascript
复制
a.each{|fruit| fruit << " pie"}

我得到的a和b等于“苹果派”,“樱桃派”。那里没问题。但假设我改变了b的一个元素:

代码语言:javascript
复制
b[1] = "blueberry"

发出同样的“每个”命令。现在b是“苹果派”,“蓝莓”,因为a和b是相同的字符串,但是a1和b1是不同的字符串。我可以在a和b上运行命令,但是b是“苹果派”、“蓝莓派”,因为我已经在同一个字符串上运行了两次附加操作。

有没有一种方法可以修改a和b的所有字符串,而不需要重复。在这个简单的例子中,我可以测试子字符串“饼”,但是这不能适用于其他类型的更改(比如删除第一个字符)。

我尝试创建一个包含所有字符串的集合,以便每个字符串都是唯一的;但是似乎集合创建复制了字符串,因此它们不能被修改到位。有没有一种方法来测试两个字符串在内存中是否相同?我在谷歌上搜索过,但什么也没找到。

它的应用是,我有大量的字符串,我用它来创建它们的历史记录。现在,我想对整个历史应用一个更改,而不是双重应用(或三重)更改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-25 16:12:50

我不理解您的用例;我怀疑您正在使事情变得比他们需要的更复杂。

有没有一种方法来测试两个字符串在内存中是否相同?

Object#object_id是你要找的东西。

是否有一种方法可以修改a和b的所有字符串,而不需要重复?

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

代码语言:javascript
复制
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"]

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16219365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档