(跟进我之前的问题,Ruby:如何复制变量而不指向同一个对象? https://stackoverflow.com/questions/1465569/ruby-how-can-i-copy-a-variable-without-pointing-to-the-same-object/1465608#1465608)
我正在编写一个简单的 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
两个问题(回答一个或两个):
- 为什么其他接受并修改此处返回值的函数也会影响全局变量,即使我使用了
.dup
复制它?
- 我是 Ruby 新手,我确信这不是最 Ruby 风格的方法(而且我不喜欢全局变量)。您能提出更好的策略吗?
修改复制的数组不会影响原始数组。然而,对数组内字符串的修改将是全局可见的,因为全局数组和复制数组仍然包含对相同字符串的引用(dup 不执行深层复制)。
因此,要么执行深复制(svg_filedata_cache = $svg_filedata_cache.map {|line| line.dup}
)或者只是避免对字符串进行变异操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)