gpt4 book ai didi

Ruby:我怎样才能复制这个数组?

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:43 26 4
gpt4 key购买 nike

(跟进我之前的问题,Ruby: how can I copy a variable without pointing to the same object?)

我正在编写一个简单的 Ruby 程序来在 .svg 文件中进行一些替换。第一步是从文件中提取信息并将其放入数组中。为了避免每次调用此函数时都从磁盘读取文件,我尝试使用 memoize 设计模式 - 在第一次调用后的每次调用中都使用缓存结果。

为此,我使用了一个在函数之前定义的全局变量。但是,即使我在返回局部变量之前将该变量.dup 为局部变量,调用该变量的函数仍在修改全局变量。

这是我的实际代码:

#memoize to keep from having to read original file on each pass
$svg_filedata_cache = [] #the global variable
def svg_filedata(filename)
if $svg_filedata_cache.empty?
File.open(filename, "r"){|f| $svg_filedata_cache = f.readlines}
end
svg_filedata_cache = $svg_filedata_cache.dup #try to copy it
return svg_filedata_cache #SHOULD point to a different object (but doesn't)
end

两个问题(回答其中一个或两个):

  1. 为什么接收和修改此处返回值的其他函数也会影响全局变量,即使我使用 .dup 复制它?
  2. 我是 Ruby 的新手,我敢肯定这不是最符合 Ruby 风格的方法(而且我不喜欢全局变量)。你能建议一个更好的策略吗?

最佳答案

修改伪数组不会影响原来的数组。然而,对数组内字符串的修改将在全局可见,因为全局数组和被复制的数组仍然包含对相同字符串的引用(dup 不执行深层复制)。

因此,要么执行深度复制 (svg_filedata_cache = $svg_filedata_cache.map {|line| line.dup}),要么简单地避免对字符串进行变异操作。

关于Ruby:我怎样才能复制这个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1465696/

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