自从听你说了 lxr 之后,我也一直没有动手搞过~ 。周末搞搞看看。
#12 楼 @loveky 你是指你的第二个关于数组的例子吗? 大体流程:
b = a.clone
会产生一个新的 Array 对象 b(其实是引用)
a 中包含的原有的对象引用也被拷贝到 b。注意是引用,不是对象。如下例中 m 的‘a’这个对象引用。b.push(4)
是对 b 所引用的对象进行操作,这个对象和 a 所引用的对象不一样,当然不会改变 a。为了你不迷糊,缩小一下叙述范围,如果一个对象内部含有对其他对象的引用,在浅拷贝时,先创建一个新对象,然后再拷贝内部包含的其他对象 (比如说是实例变量) 的引用 (这些是引用,而不是对象)。
m=['a']
n=m.clone # 克隆产生一个新对象。
n[0] << 'b' # n[0]和m[0]都指向都一个对象,对其修改,m[0]和n[0]都会改变
p n # ["ab"]
p m # ["ab"]
n << 'c' #对n 所引用的对象进行操作
p m # ["ab"] m没有变化
p n # ["ab","c"] n 增加了一个元素
建议你看看@hooopo 的帖子。其实,关于对象引用的问题,给你画个图你就能明白了。写字反而容易让人迷糊。
收藏!
#1 楼 @daqing @loveky 其实不是这样的。 在 Ruby 里,我们所说的变量等实际都是对 对像的引用。浅拷贝只是拷贝引用而已,不是拷贝引用所指的对象。
m = ['a','b'] # ["a", "b"]
n = m.clone # ["a", "b"]
m.object_id == n.object_id # false
m[0].object_id == n[0].object_id # true
m[1].object_id == n[1].object_id # true
代码中 n 是由 m 克隆来的。指向一个新对象,所以 id 不同。 但是,m 和 n 中的元素都是指向相同的对象,对象本身并没有进行拷贝。所以 id 是相同的。 当然,这和 Array 的第 1 层或是第几层也没关系。
想实现深 copy,可以自行实现 initialize_copy 来达到深 copy 的目的。
[ ] 和 fetch 是两个方法,行为是不一样的。不要混淆 :>
用 [ ] 访问 hash,在形式上比较直观。在 value 值不存在时,返回 nil。 用 fetch 的默认形式,在 value 值不存在时,会抛出异常。另外,如同@ming 所说,在在 value 值不存在时,可以做一些处理。
用 fetch 比较利于排错。比如说,某个 value 不存在,它就直接抛出异常了。[ ] 则是返回 nil. 但是,看代码,用 [ ] 的形式还是很多的。
呵呵,这个方法可以试试 :>
外星人在沈阳~
单位的电脑也是 windows,很多工具也是 ruby 写的,也没如此之纠结。Ruby 语言本身在 windows 没啥问题,就是 native gem 的编译需要花些时间来掌握而已。
解决问题的过程 才是最大的收获~ :>
遇到问题回避之~,则初时痛快,实损失的是自己 .
加油!
还是用@Rei 的方案 会比较少折腾 :>
现在咱们坛子里的技术分享帖略少一些~ :>
我觉得两个坛子现在都很好~,各自有自己的特色也是好事,只要咱们两个坛子都往好的方向发展就行~。没必要两个坛子的氛围完全一致 :>
题外话,我个人是比较不赞同在技术论坛里加入政治意识形态的气氛。