我做了一些搜索,发现了一些关于创建深度复制操作符的不同方法和帖子.
是否有一种快速简便的(内置)方式来深入复制Ruby中的对象?字段不是数组或散列.
在Ruby 1.9.2中工作.
我想在生产中获得一个对象并做一个精确的副本(复制其内容)到另一个相同类型的对象.我尝试从ruby控制台以3种方式执行此操作,但没有一个工作:
假设tt您将要复制的第一个对象tt2作为副本对象.我尝试的第一种方法是克隆数组
tt2.patients = tt.urls.patients
tt2.doctors = tt.segments.doctors
tt2.hospitals = tt.pixels.hospitals
Run Code Online (Sandbox Code Playgroud)我尝试的第二种方法是复制数组,这实际上与克隆数组相同:
tt2.patients = tt.patients.dup
tt2.doctors = tt.doctors.dup
tt2.hospitals = tt.hospitals.dup
Run Code Online (Sandbox Code Playgroud)我尝试的第三种方法是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)的所有内容都无效(患者,医生和医院都消失了).关于将一个对象的内容复制到另一个对象,您有什么其他想法吗?谢谢.
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)
但它似乎并不优雅或高效.
谢谢
我不认为这需要新的,萌芽的Rubyist很长时间才会陷入尝试使用新数组作为默认值创建哈希的陷阱,Hash.new([])但却发现该方法没有按预期运行.(如果您不确定我在说什么,请参阅此Stack Overflow问题和所选答案.)
有谁知道这是否是一个历史或其他原因,这是默认行为?因为我从未遇到过我想要这种行为的情况.而且,即使考虑到Rubyist想要这种行为的假设理由也不是一件容易的事.
我理解这种方式更加一致,因为它以相同的方式处理可变和不可变的默认值,但是对于可变和不可变的默认值具有不同的默认行为似乎并不那么糟糕.