gpt4 book ai didi

ruby - 克隆或复制 Ruby 的 Scan 方法的结果数组?

转载 作者:数据小太阳 更新时间:2023-10-29 08:47:46 24 4
gpt4 key购买 nike

假设我使用正则表达式 /(a)|(b)/ 通过 Ruby 的 Scan 方法传递字符串“abcd”。这将返回一个数组:

>> results_orig = "abcd".scan(/(a)|(b)/)
#=> [["a", nil], [nil, "b"]]

现在,如果我复制 (.dup) 或克隆 (.clone) 这个数组,

>> results_copy = results_orig.dup
#=> [[["a", nil], [nil, "b"]]

并修改此副本的任何元素,原始数组也会被修改!

>> results_copy[0][0]="hello"
#=> "hello"
>> results_copy
#=> [["hello", nil], [nil, "b"]]
>> results_orig
#=> [["hello", nil], [nil, "b"]]

这很奇怪,因为首先,数组具有不同的对象 ID(results_orig.object_id == results_copy.object_id 返回 false),其次,它确实如果数组不是扫描方法的产物,则不会发生。要了解后者,请考虑以下示例。

>> a = [1, 2, 3]
>> b = a.dup
>> b[0] = "hello"
>> a
#=> [1, 2, 3]
>> b
#=> ["hello", 2, 3]

我目前的解决方案是运行扫描两次并在单独的对象中捕获每个数组——即 r_orig = "abca".scan(/(a)|(b)/)"; r_copy = "abca".scan(/(a)|(b)/)。但是当我必须扫描数百个字符串时,这将非常低效。

是否有适当的方法从 Scan 的结果中复制数组,然后我可以在不损坏原始结果数组的情况下对其进行修改?

编辑 #1:我在 Mac OS X 10.9.2 上运行 Ruby 2.0.0-p353。

编辑 #2:当数组结构嵌套时,问题似乎就存在了……简单(单级)数组似乎没有这个问题。更正我的示例以反射(reflect)这一点。

最佳答案

你需要做一个深拷贝。 Check out this article想要查询更多的信息。本质上,您需要做

copied_array = Marshal.load(Marshal.dump(complex_array))

代码来源:http://thingsaaronmade.com/blog/ruby-shallow-copy-surprise.html .编码适用于数组,但不适用于每个对象。 question 的答案是执行深拷贝的更可靠的方法。 .

关于ruby - 克隆或复制 Ruby 的 Scan 方法的结果数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22318200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com