相关疑难解决方法(0)

如何在Ruby中创建对象的深层副本?

我做了一些搜索,发现了一些关于创建深度复制操作符的不同方法和帖子.

是否有一种快速简便的(内置)方式来深入复制Ruby中的对象?字段不是数组或散列.

在Ruby 1.9.2中工作.

ruby copy ruby-on-rails object deep-copy

50
推荐指数
4
解决办法
3万
查看次数

Ruby中数组的深层副本

我想在生产中获得一个对象并做一个精确的副本(复制其内容)到另一个相同类型的对象.我尝试从ruby控制台以3种方式执行此操作,但没有一个工作:

  1. 假设tt您将要复制的第一个对象tt2作为副本对象.我尝试的第一种方法是克隆数组

    tt2.patients  = tt.urls.patients
    tt2.doctors   = tt.segments.doctors
    tt2.hospitals = tt.pixels.hospitals
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我尝试的第二种方法是复制数组,这实际上与克隆数组相同:

    tt2.patients  = tt.patients.dup
    tt2.doctors   = tt.doctors.dup
    tt2.hospitals = tt.hospitals.dup
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我尝试的第三种方法是marhsalling.

    tt2.patients  = Marshal.load(Marshal.dump(tt.patients)) 
    tt2.doctors   = Marshal.load(Marshal.dump(tt.doctors)) 
    tt2.hospitals = Marshal.load(Marshal.dump(tt.hospitals)) 
    
    Run Code Online (Sandbox Code Playgroud)

以上都不适用于从一个阵列到另一个阵列的深度复制.在上面单独尝试每种方法后,第一个对象(tt)的所有内容都无效(患者,医生和医院都消失了).关于将一个对象的内容复制到另一个对象,您有什么其他想法吗?谢谢.

ruby arrays clone copy ruby-on-rails

14
推荐指数
2
解决办法
2万
查看次数

复制Ruby字符串数组

arr = ["red","green","yellow"]

arr2 = arr.clone
arr2[0].replace("blue")

puts arr.inspect
puts arr2.inspect
Run Code Online (Sandbox Code Playgroud)

生产:

["blue", "green", "yellow"]
["blue", "green", "yellow"]
Run Code Online (Sandbox Code Playgroud)

无论如何都要做一个字符串数组的深层副本,除了使用Marshal,因为我知道这是一个黑客.

我可以:

arr2 = []
arr.each do |e|
  arr2 << e.clone
end
Run Code Online (Sandbox Code Playgroud)

但它似乎并不优雅或高效.

谢谢

ruby arrays clone copy dup

10
推荐指数
3
解决办法
2万
查看次数

Ruby的<opinion> odd </ opinion>默认Hash.new([])行为的原因

我不认为这需要新的,萌芽的Rubyist很长时间才会陷入尝试使用新数组作为默认值创建哈希的陷阱,Hash.new([])但却发现该方法没有按预期运行.(如果您不确定我在说什么,请参阅此Stack Overflow问题和所选答案.)

有谁知道这是否是一个历史或其他原因,这是默认行为?因为我从未遇到过我想要这种行为的情况.而且,即使考虑到Rubyist想要这种行为的假设理由也不是一件容易的事.

我理解这种方式更加一致,因为它以相同的方式处理可变和不可变的默认值,但是对于可变和不可变的默认值具有不同的默认行为似乎并不那么糟糕.

ruby

0
推荐指数
1
解决办法
91
查看次数

标签 统计

ruby ×4

copy ×3

arrays ×2

clone ×2

ruby-on-rails ×2

deep-copy ×1

dup ×1

object ×1