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

2024-01-23

(跟进我之前的问题,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

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

  1. 为什么其他接受并修改此处返回值的函数也会影响全局变量,即使我使用了.dup复制它?
  2. 我是 Ruby 新手,我确信这不是最 Ruby 风格的方法(而且我不喜欢全局变量)。您能提出更好的策略吗?

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby:我怎样才能复制这个数组? 的相关文章

随机推荐

  • 在onCreate中从TextLayout获取Bitmap

    我能够转换Layout with a TextView into a Bitmap 只要事件发生after onCreate 但当我尝试时during在创建时 它不起作用 有办法让它发挥作用吗 我尝试过使用inflate 以各种方式 没有喜
  • WSO2 API Manager 身份验证错误内容类型

    我配置了 WSO2 API Manager 一切似乎都工作正常 唯一困扰我的问题是 如果出现 Auth 异常 API 管理器总是返回 XML 内容类型的响应 例如
  • IntelliJ 调试器卡住

    我正在调试一个普通的 Java 应用程序 没有 GUI 只有大量计算和主线程堆栈中的约 5 个调用 当问题发生时 基本上它一直在局部变量监视中显示 正在收集数据 So instead of going step by step I ve t
  • 在当前进程中通过python运行bat文件

    我正在尝试通过 python 脚本构建一个大型系统 我首先需要设置 Visual Studio 的环境 遇到问题后 我决定看看是否可以设置并启动 Visual Studio 我首先设置几个环境变量 然后调用C Program Files x
  • 如何在通知上显示计时器?

    如何在通知上显示我的计时器 我有一个应用程序启动用户指定的计时器 我想在通知上显示计时器 即使我的应用程序已关闭 我也使用服务来运行计时器 并且我使用 SharedPreference 来传递用户设置给服务的持续时间 这是我的代码 第2页
  • 关于mongodb更新操作的safe=True参数的问题

    我使用 pymongo python 模块工作 mongodb 数据库 我的代码中有一个函数 调用该函数时会更新集合中的记录 如下所示 for record in coll find
  • 是否可以将包含无关元素的字典传递给 Django object.create 方法?

    我知道在 Django 中使用 MyModel objects create 时 可以传入一个字典 其中的键对应于 MyModel 中的模型字段 这在另一个问题中得到了解释 可以在创建时将字典传递给 django 模型吗 https sta
  • Eclipse:实时编辑和运行代码

    在 Eclipse 中编辑 Java 代码时 我可以在代码运行时以各种方式修改代码 并使这些更改生效 而无需重新启动程序 该功能背后的技术是什么 它是 Eclipse 的一部分 还是可以使用命令行工具和 JDK 附带的工具来完成 它是 JV
  • python:不支持 OpenCV 图像深度(CV_64F)

    因此 我尝试使用以下代码显示仅黑白的二进制图片 import cv2 import numpy as np x img cv2 imread lenac tif x img g cv2 cvtColor x img cv2 COLOR BG
  • C++ 类(公共、私有和受保护)

    C 中的类如何声明public private or protected 在 C 中 不存在像 Java 或 C 中那样整个类具有访问说明符的概念 如果一段代码具有类的可见性 则它可以引用该类的名称并对其进行操作 也就是说 这有一些限制 例
  • ICellStyle FillForegroundColor 的自定义颜色而不是提供的命名颜色

    我们刚开始使用 NPOI 组件 我们在设置 ICellStyle 属性的 FillForegroundColor 时遇到问题 ICellStyle HeaderCellStyle xssfworkbook CreateCellStyle H
  • 转置在谷歌表格中的 arrayformula 内不起作用

    我想运行一个查询来调用针对联系号码所做的所有评论 并在整个列中自动转置它们 我尝试过使用 arrayformula 但它不起作用 ARRAYFORMULA IF ROW A A 1 Previous meets IF isblank A A
  • 如何模拟 IDataReader 来测试将 SqlDataReader 转换为 System.DataView 的方法

    我是最小起订量的新手 我正在努力编写单元测试来测试转换的方法SqlDataAdapter to System DataView 这是我的方法 private DataView ResolveDataReader IDataReader da
  • 在 webdriver 中查找任意两个元素

    在我的应用程序中 当我打开页面 X 时 我希望看到元素 A 或元素 B 它们被放置在 DOM 中的不同位置 并且可以使用它们的 id 找到 例如driver findElement By id idA 我怎样才能让 webdriver 找到
  • 期待异常时避免空的 catch 块

    我正在尝试使用解析日期SimpleDateFormat 由于我的服务采用多种日期格式 我采用了this https stackoverflow com questions 4024544 how to parse dates in mult
  • jQuery:选择不是某个类的后代的所有元素

    div class container div class x div p span text span p div div div div p span class x text span span text span p div div
  • 如何检测Android布局中的方向变化?

    我刚刚实现了方向改变功能 例如当布局从纵向变为横向时 反之亦然 如何检测方向更改事件何时完成 The OrientationEventListener没用 如何获取有关布局方向更改事件的通知 Use the onConfigurationC
  • 不支持的数据类型:GORM 字段上的 &[] 错误,其中自定义 Valuer 返回 nil?

    我试图为 postgres 数据库创建一个 GORM 模型 其中包含一个带有自定义的类型Scanner and Valuer将字符串切片与字符串相互转换 以保存为单个数据库列 如果切片为空或 nil 我希望数据库列也为 nil 而不是空字符
  • Qtwidgets 的问题

    我刚刚学习如何使用 Qtdesigner 和 Pycharm 创建 GUI 所以我构建了一个非常简单的 GUI 有两个底部和一个标签 在 pycharm 中编译 ui 文件并编写以下代码来执行它后 from PySide2 import Q
  • Ruby:我怎样才能复制这个数组?

    跟进我之前的问题 Ruby 如何复制变量而不指向同一个对象 https stackoverflow com questions 1465569 ruby how can i copy a variable without pointing