使用 [].replace 复制数组

2023-12-02

我有一堂课,我正在使用Array#shift实例变量上的实例方法。我以为我制作了实例变量的“副本”,但事实上我没有并且shift实际上是在改变实例变量。

例如,在我期望得到之前["foo", "bar", "baz"]两次均给出以下信息:

class Foo
  attr_reader :arr
  def initialize arr
    @arr = arr
  end

  def some_method
    foo = arr
    foo.shift
  end
end

foo = Foo.new %w(foo bar baz)
p foo.arr #=> ["foo", "bar", "baz"]
foo.some_method
p foo.arr #=> ["bar", "baz"]

result:

["foo", "bar", "baz"]
["bar", "baz"]

但如图所示,我的“副本”根本不是真正的副本。现在,我不确定是否应该将我想要的称为“复制”,“克隆”,“dup”,“深度克隆”,“深度dup”,“冻结克隆”等......

我真的很困惑要搜索什么,并发现了一堆疯狂的尝试来做看起来像“制作数组的副本”的事情。

然后我发现另一个答案从字面上看,一行就解决了我的问题:

class Foo
  attr_reader :arr
  def initialize arr
    @arr = arr
  end

  def some_method
    foo = [].replace arr
    foo.shift
  end
end

foo = Foo.new %w(foo bar baz)
p foo.arr #=> ["foo", "bar", "baz"]
foo.some_method
p foo.arr #=> ["foo", "bar", "baz"]

output:

["foo", "bar", "baz"]
["foo", "bar", "baz"]

我明白那个Array#replace是在实例上调用的实例方法Array这恰好是一个空数组(例如foo = ["cats", "and", "dogs"].replace arr仍然有效)并且我得到实例变量的“副本”是有道理的@arr.

但这与以下有何不同:

foo = arr
foo = arr.clone
foo = arr.dup
foo = arr.deep_clone
Marshal.load # something something
# etc...

或者任何其他疯狂的组合dup and map and inject我在SO上看到的?


这是 ruby​​ 中可变性的棘手概念。就核心对象而言,通常会出现数组和哈希。字符串也是可变的,但是可以通过脚本顶部的标志来禁用它。看注释“frozen_string_literal: true”有什么作用?.

在这种情况下,您可以调用dup, deep_dup, clone轻松达到相同的效果replace:

['some', 'array'].dup
['some', 'array'].deep_dup
['some', 'array'].clone
Marshal.load Marshal::dump(['some', 'array'])

从差异来看,dup and clone除了一些细微的细节之外,其他都是相同的 - 请参阅Ruby 的 dup 和 clone 方法有什么区别?

这些和之间的区别deep_dup就是它deep_dup递归地工作。例如,如果复制嵌套数组,则内部数组将不会被克隆:

  a = [[1]]
  b = a.clone
  b[0][0] = 2
  a # => [[2]]

哈希值也会发生同样的情况。

Marshal.load Marshal::dump <object>是深度克隆对象的通用方法,与deep_dup,位于 ruby​​ 核心中。Marshal::dump返回一个字符串,因此可以方便地将对象序列化到文件。

如果您想避免此类意外错误,请记住哪些方法有副作用,并且仅在有意义时才调用这些方法。方法名称末尾的解释点表明它有副作用,但其他副作用包括 unshift、push、concat、delete 和 pop。函数式编程的一个重要部分是避免副作用。你可以看到https://www.sitepoint.com/functional-programming-techniques-with-ruby-part-i/

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

使用 [].replace 复制数组 的相关文章

随机推荐

  • 基于用户选项的 PHP 动态 SQL SELECT 语句

    首先 我想提一下 我一直在疯狂地尝试和搜索以找到解决方案 但到目前为止还没有运气 我的问题如下 我有一个包含数十行的 MySQL 数据库 我创建了一个 jQuery 网格来显示数据 该页面已经可以使用了 根据要求 我正在整理一个页面 人们可
  • IIS 7.5 URL重写规则基于用户代理处理请求

    我编写了一条基于用户代理重定向请求的规则 该规则设置为将默认请求 非移动 重定向到Domain1以及从移动设备到移动域的请求 Domain2 即使在应用移动重定向后 来自移动设备的所有请求都会被带到Domain1 请参阅下面的重定向规则 谁
  • 扩展基础移动 Azure 示例(.net 后端)

    因此 我创建了一个天蓝色移动服务 下载了一个项目并运行它 第一次启动后 我在数据库中看到一些新表 TodoItems 有 2 项 和 MigrationHistory 到目前为止 一切都很好 现在 我想添加一张额外的桌子 我正在制作新模型M
  • XSLT 1.0 比较日期

    我想将当前日期与开始日期和结束日期进行比较 XML is
  • ggplot2:组合绘图时修复轴高度/宽度[重复]

    这个问题在这里已经有答案了 library ggplot2 library gridExtra df1 lt data frame x c A1 A2 A3 A4 something c 10 18 24 32 df2 lt data fr
  • Google App 脚本返回多行数组

    Summary 我是 Google Apps 脚本的新手 但我花了相当多的时间进行研究 但一无所获 基本上我正在尝试复制 SQL 的交叉连接功能 我有 2 个表 一个包含 12 个月的日历表 一个包含 3 个客户的客户表 客户表由 Goog
  • Hive 查询中的时间连接(时间上非常接近的事件)

    我需要一个我很难弄清楚的配置单元查询 我有一个时间序列 如下所示 time source word1 word2 etc 2012 02 01 23 43 16 9988243 0001 2B3B FAF0 2012 02 01 23 43
  • 将三个用例合并为一个用例

    我有一个演员 管理员 他可以对其他用户帐户执行一些操作 例如创建帐户 编辑帐户和删除帐户帐户 我应该做这样的事情 gt UseCase createAccount o gt UseCase DeleteAccount Admin gt Us
  • 对“qInitResources_systray()”的未定义引用

    我用qt官方示例并得到错误 media roroco disk750 Downloads qtbase examples widgets desktop systray main cpp 50 undefined reference to
  • 自动填充用户名和密码 UIWebView Swift

    我发现了很多在 Objective C 中自动填充用户名和密码的方法 但我不知道如何让它与 Swift 一起工作 这段代码的 Swift 等价物是什么 这是否适合我想要完成的任务 谢谢 void webViewDidFinishLoad U
  • 如何判断某个蓝牙设备是否已连接?

    我想使用 applescript 进行定期 每秒 检查以查看是否连接了特定的蓝牙设备 如果是 则弹出快速通知 为了框架它 我想要一个弹出窗口 当我的 Airpods 连接时 因为有时当我把它们拉出来时 它会连接到我的电脑 有时会连接到我的
  • XCode 无法识别环境变量

    我使用以下脚本在 OSX Yosemite 10 10 5 上运行 XCode 7 0 1 7A1001 export FOO bar this should not be necessary but just in case launch
  • 如何配置 Oracle tnsnames 文件位置? [关闭]

    Closed 这个问题是无关 目前不接受答案 我在 Windows 上安装了 Oracle 10g 目前 我的 tnsnames 文件存储在 ORACLEHOME network admin 中 但是 我想将 Oracle 配置为在其他位置
  • 尝试从 C 中的字符串中删除所有数字

    我试图从字符串 char 中取出所有数字 这是我现在所拥有的 Take numbers out of username if they exist don t care about these char newStr strtoul use
  • iPhone,addSubView不调用willViewAppear?

    我正在添加一个视图 addSubView 我也在其他地方使用该视图presentModalViewController viewWillAppear使用presentModalViewController 调用 但不使用addSubView
  • 使用前导下划线真的会带来麻烦吗?

    C C 标准保留所有标识符以下划线开头 如果不在全局命名空间中 则加上大写字母 或包含两个或多个相邻的下划线 例子 int myGlobal namespace mine void Im outta control int LivingDa
  • 为什么 html br 断行标记在此代码中不起作用? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 有人能告诉我为什么我的 php 换行符不起作用 回显 吗 我知道我可以用不同的方式编写代码以使换行符起作用 但我想知道这背后的原因 看来我
  • 为什么iOS坐标系很难理解??只有我?

    我正在研究iOS的UIView 我发现我无法理解边界是如何工作的 For example 请运行此代码 并看到红色框在移动 红框升起来了 白色的根视图是静态的 为什么 为什么红框会上升 请让我知道OTL class ViewControll
  • 互相关

    我一直在尝试找到时移信号响应与作为参考的另一个信号响应之间的互相关性 但发现很难使我的时移反映在 xcorr 函数中 matlab代码粘贴在下面 如果有人能就如何实现xcorr函数提出建议 我将不胜感激 这样我就可以确定两个信号响应相关的时
  • 使用 [].replace 复制数组

    我有一堂课 我正在使用Array shift实例变量上的实例方法 我以为我制作了实例变量的 副本 但事实上我没有并且shift实际上是在改变实例变量 例如 在我期望得到之前 foo bar baz 两次均给出以下信息 class Foo a