(回答我的早前问题,Ruby:如何复制变量而不指向同一对象?)
我正在编写一个简单的 Ruby 程序,在 .svg 文件中进行一些替换。第一步是从文件中提取信息并将其放入数组中。为了避免在每次调用该函数时从磁盘读取文件,我尝试使用记忆化设计模式 - 在第一次调用后的每次调用中使用缓存结果。
为此,我在函数之前定义了一个全局变量。但即使在返回本地变量之前将该变量复制(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 的新手,我相信这不是最 Rubyesque 的方法(而且我也不喜欢全局变量)。你能建议一个更好的策略吗?