Ruby:对象深复制

2024-04-03

我正在研究一些在 Ruby 中深度复制对象的技术(MRI 1.9.3)。
我遇到了以下示例,但我不确定#dup方法实施。 我测试了它并且它确实有效,但是我不理解该方法的逻辑步骤,因此我不舒服在我自己的代码中使用它。

是声明@name = @name.dup参考 iVarinside副本?如何?我看不到它。

有人可以解释一下吗?
另外,还有更好的方法吗?

class MyClass
  attr_accessor :name

  def initialize(arg_str)   # called on MyClass.new("string")
    @name = arg_str         # initialize an instance variable
  end

  def dup
    the_copy = super        # shallow copy calling Object.dup
    @name = @name.dup       # new copy of istance variable
    return the_copy         # return the copied object
  end
end

这是一个非常简单、非常具体的“深度复制”实现。它所展示的是创建一个独立的@name克隆中的实例变量,以便使用就地操作修改实例变量的名称不会产生更改克隆的副作用。

通常,深复制操作对于嵌套数组或哈希之类的东西很重要,但它们也适用于具有引用此类事物的属性的任何对象。

在你的情况下,要制作一个更强大的对象dup方法,你应该调用dup关于每个有问题的属性,但我认为这个例子有点糟糕。它的作用是替换@name在原件中附上副本,这可能会破坏您拥有的任何参考资料。

更好的版本是:

def dup
  copy = super
  copy.make_independent!
  copy
end

def make_independent!
  instance_variables.each do |var|
    value = instance_variable_get(var)

    if (value.respond_to?(:dup))
      instance_variable_set(var, value.dup)
    end
  end
end

这应该具有复制支持的任何实例变量的效果dup方法。这会跳过数字、布尔值等内容nil这是无法复制的。

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

Ruby:对象深复制 的相关文章

  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • 使用 attr_accessor 动态创建类属性

    在Ruby中 有没有办法动态地将实例变量添加到类中 例如 class MyClass def initialize create attribute name end def create attribute name attr acces
  • 我在 Rails 中使用了保留字吗?

    这是我的模型 class Record lt ActiveRecord Base belongs to user belongs to directory end class Directory lt ActiveRecord Base h
  • Nokogiri 保持 HTML 实体不变

    我希望 Nokogiri 保持 HTML 实体不变 但它似乎正在将实体转换为实际的符号 例如 Nokogiri HTML fragment p reg p to s 结果是 p p 似乎没有什么可以将原始 HTML 返回给我 inner h
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 使用rSpec 测试delayed_job 链的最佳方法是什么?

    目前 当我的代码中有一个延迟方法时 如下所示 CommentMailer delay deliver comments comment true 我在规范中写了这样的内容 dj mock DelayProxy CommentMailer s
  • 超类与类SpecificationPolicy不匹配

    我得到了一个superclass mismatch for class SpecificationPolicy尝试安装或升级某些brew 软件包时出错 例如 更新安装 supabase CLI 时 brew install supabase
  • 使用 ruby​​ 调整动画 GIF 图像的大小?

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma
  • 子文件夹和关系中的 Rails 模型

    我在自动加载的文件夹中组织了一些轨道模型 config autoload paths Dir Rails root join app models 我可以直接使用所有模型 例如Image first file name 但是当我尝试通过关系
  • 从logstash中的文件名获取事件的时间戳

    我们有一个将事件写入文件的进程 没有时间戳 文件名本身带有时间戳后缀 该时间戳应用于文件中的所有事件 现在 我尝试使用logstash的输入文件插件来解析该文件 有没有一种方法可以将文件名获取到字段 以便我可以使用 gsub 过滤器提取时间
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • sqlite3-ruby gem:无法构建 gem 本机扩展

    Update 看看这个后续问题 Windows 上的 Gem 更新 它坏了吗 https stackoverflow com questions 134581 gem update on windows is it broken 在 Win
  • 如何在 mongoid 中使用 or 条件进行查询

    如何在 Mongoid 中使用 or 条件进行查询 这是 OR 在 mongoid 中查询 如果你想要像下面这样的查询 select from user where id 10 or name hitesh 在带有 mongoid 的 Ra
  • ruby 中 Array#uniq 方法的时间复杂度是多少?

    谁能告诉我 ruby 内部使用哪种算法来使用 ruby 数组删除重复项Array uniq method 来自docs http www ruby doc org core 1 9 3 Array html static VALUE rb
  • 更改 en.yml 文件中的属性名称不起作用

    我更改了 ruby on Rails 项目中 en yml 文件中的属性名称 按钮工作正常 但字段属性并没有改变 这是我的模型 class Enr AffordableWarmth lt ActiveRecord Base self tab
  • 自动将 JSON 对象映射到 Ruby 中的实例变量

    我希望能够自动将 JSON 对象解析为实例变量 例如 使用此 JSON require httparty json HTTParty get http api dribbble com players simplebits gt shots
  • 使用yard创建文档时如何防止[查看源代码]链接?

    我正在使用yard生成项目文档 但我不想在文档中显示 查看源代码 链接 我已深入研究yard官方指南 但仍然没有得到解决方案 有什么想法吗 谢谢 我可能有点晚了 但您可以通过从 method details 部分中删除 源 部分来轻松自定义
  • 使用哈希时 fetch 与 [] ? [复制]

    这个问题在这里已经有答案了 来自鲁比 科恩斯about hashes rb 为什么你可能想使用 fetch代替 当访问哈希键时 默认情况下 使用 如果存在则检索哈希值 如果不存在则返回 nil Using fetch给你一些选择 请参阅文档
  • 迭代带有小胡子的数组

    如何获取迭代中当前元素的引用 my array p what goes here p my array 我希望我只是忽略了显而易见的事情 根据规范的变更日志 https github com mustache spec blob maste
  • 比较 ruby​​ 中的两个字符串[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我刚刚开始学习 ruby 这可能很容

随机推荐

  • Xcode 12.4 React Native 构建在 IOS 中失败显示所有消息命令 PhaseScriptExecution 失败并出现非零退出代码

    我是 React Native 的新手 我想在 React Native 初始化后在 IOS 中运行 React Native 应用程序 应用程序未在 IOS 中运行显示一些错误 显示所有消息 bash Native social logi
  • C# - 初始化器内类字段的闭包?

    考虑以下代码 using System namespace ConsoleApplication2 class Program static void Main string args var square new Square 4 Con
  • 怎么转?如何将多行转换为一行多列?

    我有两张表想要合并 第一张桌子是客户的 另一张桌子是产品的 目前我有 22 个产品 但我想要一个灵活的数据库设计 因此产品数据库中不是有 22 列 而是每个客户的每个产品有 1 行 因此如果我总体添加或删除 1 个产品 我不会必须更改数据库
  • PHP:使用方法作为回调

    我试图使用array walk recursive对于某些事情 并想使用类的方法之一作为回调 所以尝试 array walk recursive TAINTED this gt encode 及其变体都失败了 我最终决定 array wal
  • 如何在 main() 之前调试程序崩溃

    我在 Windows 8 1 上使用 QtCreator 和 Visual Studio 2015 套件来构建我在 Linux 上开发和测试的程序 在 Linux 上它工作正常 但在 Windows 上它立即崩溃 我不知道要寻找什么 除了我
  • .htaccess 中单个 RewriteCond 的多个 RewriteRules

    我的 htaccess 中有以下命令 RewriteCond HTTP HOST www a z0 9 example com NC RewriteRule a z 2 1 2 L RewriteRule 0 9 a z 2 1 3 2 L
  • pieCSS3:不在本地四舍五入

    我正在尝试使用饼图获得圆角 ul li webkit border radius 8px 8px 0 0 moz border radius 8px 8px 0 0 border radius 8px 8px 0 0 color FFFFF
  • 从 API 控制器调用 POST 方法

    我有一个名为 MyFIlesController 的 API 控制器 在其中 我有这个方法 POST api myfiles public void Post FromBody string value 以下是我用 Fiddler 的调用方
  • 有没有java图像库?

    我是 java 图像处理新手 我的任务是重新调整网站图像的大小和比例 有没有一个简单的库可以完成这项任务 一个我必须下载 jar 的库 添加到我的项目中 我不喜欢被迫在 Windows 上安装编解码器和文件 我需要该库仅支持基本功能 Lib
  • Visual Studio 在断点处冻结

    自一周前以来 我在 VS2010 中看到了一个非常烦人的行为 当我正在调试一个项目时 调试器在断点处停止 Windows 冻结了近十秒 我说 Windows死机 是因为这段时间鼠标和键盘没用 该问题仅在我调试特定项目时发生 并且我在两台不同
  • 使用 Java 在 Mac 上以编程方式发送电子邮件(通过 Mac 邮件客户端)

    我对这个问题做了很多研究 但似乎无法为我的问题提出可靠的解决方案 我正在开发一个 Java 客户端应用程序 它 应该 允许用户从 Mac 地址簿中导入联系人 方法是以列表格式获取联系人 并允许用户选择一个子集 全部 然后单击一个按钮 将 邀
  • Java中的Goto语句[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我执行了下面的代码Eclipse http en wikipedia org wiki Eclipse 28software 29 但是GO
  • 人眼注视检测:识别用户正在看板上的位置[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在开发一个项目 上面有板和相机 目标是识别正在看黑板的学生 并确定他们视线的位置 在黑板上 目前 我计划从以下几个方面来应对挑
  • 如何关闭 ASP.NET 必填字段验证器“失去焦点”行为

    我有一些代码 其中一个控件需要两个单独的必填字段验证器 两个验证器都位于单独的验证组中 然后由两个单独的按钮进行验证 当单击按钮时 这种方法效果很好 但如果我在文本框中输入一个值然后将其删除 两个验证器都会显示 有没有办法关闭这种 失去焦点
  • boto s3 Bucket 与 get_bucket

    我尝试访问存储桶内的密钥 尽管我有该密钥的权限 但我没有该权限 为了能够做到get key this is my key 我需要桶对象 conn boto connect s3 key secret key my bucket conn g
  • 实体框架 4 的 System.Reflection.ReflectionTypeLoadException

    我在 Windows 窗体应用程序中使用 EF4 每当我在未安装 Visual Studio 2010 的计算机中运行发布文件时 我都会遇到问题 我总是收到此错误 System Reflection ReflectionTypeLoadEx
  • 如何修改Makefile以支持交叉编译?

    我有以下 Makefile CC g top srcdir SRC DIR cpp src INCLUDES I top srcdir I top srcdir command classes I top srcdir platform I
  • 从 URL 加载 UITableViewCell 的图像(需要异步加载)

    我有一个自定义类 它可以解析 XML 并获取图像的 URL 字符串 我将其存储在数组中 然后我想检索这些字符串来加载图像并将每个字符串显示在 UITableViewCell 中 这是我的代码 UITableViewCell tableVie
  • 禁用 yum 事务检查文件冲突

    如何禁用文件的 yum 事务检查 Transaction check error file usr local xenco backend current from install of xenco rr 1 9 6 104 x86 64
  • Ruby:对象深复制

    我正在研究一些在 Ruby 中深度复制对象的技术 MRI 1 9 3 我遇到了以下示例 但我不确定 dup方法实施 我测试了它并且它确实有效 但是我不理解该方法的逻辑步骤 因此我不舒服在我自己的代码中使用它 是声明 name name du