在ruby 中,你经常会遇到一些相互赋值
比如说
a = 1
b = a
a += 1
puts b
按照我们C语言的经验,这个输出是什么了 输出的值为 1 , 也就是说b 不会随着 a 的值变化而变化。
a =[1, 2]
b = a
a<<3
puts b.inspect
想想看, 现在的输出是多少了? [1, 2] ? No 结果是 [1, 2, 3]
很神奇吧。。。。。
那有些人就问我, 那我想copy之后,双方就不相互影响怎么办?
有两个办法 dup 和clone
a= [1, 2]
b = a.dup
a<<3
puts b.inspect
好了,现在我们让a 变得更加复杂点。
a =[[1, 2]]
b = a.dup
a[0] << 3
puts b.inspect
结果是什么, 你会发现你的b 还是受到影响了。。。。。
也就是说使用dup, 只能copy 最表层的数据 使其不受影响。。。。
如果你要copy全部的数据,而不受影响的话, 那就要使用Marshal
a = [[1, 2]]
b = Marshal.load( Marshal.dump(a) )
a[0] << 3
puts b.inspect