或許值得注意如果
a = [["cat", "pig"], "hat", "dog"] # => [["cat", "pig"], "hat", "dog"]
b = a.dup # => [["cat", "pig"], "hat", "dog"]
然後
a[0].delete_at(0)
a # => [["pig"], "hat", "dog"]
b # => [["pig"], "hat", "dog"]
這裏你需要這樣做:
a = [["cat", "pig"], "hat", "dog"]
b = a.dup
b[0] = a[0].dup
a[0].delete_at(0)
a # => [["pig"], "hat", "dog"]
b # => [["cat", "pig"], "hat", "dog"]
現在假設a
是要複雜得多,比如,哈希其值是散列的數組的數組。顯然,必須注意製作a
的副本,這些副本不會因刪除a
的某些深層嵌套元素而受到影響。你想要的就是所謂的「深層複製」,而不是由Object#dup和Object#clone所做的「淺層」複製。
幸運的是,有一個簡單的方法,使任何對象的深拷貝,使用Marshal#dump和Marshal#load:
b = Marshal.load(Marshal.dump(a))
a[0].delete_at(0)
a # => [["pig"], "hat", "dog"]
b # => [["cat", "pig"], "hat", "dog"]
順便說一句,Marshal
也可以用來保存對象到文件供以後檢索:
File.open('myfile', 'w+') do |f|
Marshal.dump(a, f)
end
File.open('myfile') do |f|
c = Marshal.load(f)
end
c # => [["cat", "pig"], "hat", "dog"]
一句警告:在所有版本的Ruby中,元帥文件都不是不可移植的。
我剛剛注意到「DUP」方法在進行字符串操作時不起作用。例如,如果我做b [0] .upcase!兩個數組的第一個元素都被改變了。對此有何洞察? –