作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] 有关於Ruby阵列的问题..
时间Sun Nov 26 23:02:07 2006
※ 引述《fuha (mimi)》之铭言:
: temp[1][1] = 3 => [[0,0],[0,3]]
: temp2[1][1] = 3 => [[0,3],[0,3]]
: 为什麽 temp 和temp2 的值会不一样啊?????????
改一个值却有两样东西被改到了,就要赶快猜其实那两样是指向同一个 instance
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 140.120.90.189
: 推 jtmh:temp2 中的两个阵列其实是同一个,详情请参考 Core API doc: 11/26
: → jtmh:http://www.ruby-doc.org/core/classes/Array.html#M002202 11/26
: 推 fuha:抱歉~他的说明和范例我不是很懂 可否再给点提示? thx 11/26
根据该说明:
> In the second it is created with size copies of obj
> (that is, size references to the same obj).
亦即每个元素会指向同一个 object
也就是说你的 temp 和 temp2 本身的写法就是不等价的
不知道你对这部份是否有疑问?如果有的话……
temp = [[0,0],[0,0]]
这个的意思是 temp 是个 Array, 里面有两个 element,
每个 element 是各个独立的 Array, 里面又各有两个 0 这个 Fixnum 的 element
temp2 = Array.new(2, [0,0])
这样的话,temp2 是个 Array, 里面有两个 element,
每个 element 都指向你这边写的 [0,0] 这个 Array
而这个 Array 里面有两个 Fixnum 的 element
注意,因为他们全是指向这个 [0,0], 所以你改变他的值,
将使所有的 element 的值都改变
套句 C++ 的术语的话……这个就是 shallow copy 而非 deep copy...
抱歉跟 C++ 比较熟 :o
意思就是你只复制了指标,没有复制内容
我写成 Ruby code:
class Array
def self.shallow_new size, target
result = []
size.times{|i| result.push target }
result
end
def self.deep_new size, taget
result = []
size.times{|i| result.push taget.clone }
result
end
end
temp = Array.shallow_new 2, [0,0]
temp[1][1] = 3 # <= [[0,3],[0,3]]
temp = Array.deep_new 2, [0,0]
temp[1][1] = 3 # <= [[0,0],[0,3]]
大概就是这样了
--
Hear me exalted spirits. Hear me, be you gods or devils, ye who hold
dominion here:
I am a wizard without a home. I am a wonderer seeking refuge.
Sacrifice
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.228.88.46
1F:推 fuha:感谢指点~v( ̄︶ ̄)y, 我想请问一下 shallow copy 在什麽时候 11/27 08:36
2F:→ fuha:会用到啊?(可能是我写得程式不多......╮(﹋﹏﹌)╭..) 11/27 08:36