赞 | 0 |
VIP | 0 |
好人卡 | 1 |
积分 | 1 |
经验 | 167035 |
最后登录 | 2013-9-15 |
在线时间 | 57 小时 |
Lv1.梦旅人 风之塞尔达
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 57 小时
- 注册时间
- 2005-10-22
- 帖子
- 2492
|
.clone方法返回的的确是Viewport.rect的属性的拷贝,
但是clone方法返回的是一个"冻结的,且会感染原实例"的实例(我英文不好- -!!)...
也就是clone产生的实例被修改了,会影响到原实例. 但是源实例被修改了,则clone产生的实例不会受到影响
- a = Viewport.new(0,0,12,12)
- b = a.rect.clone
- a.rect.width = 24
- p a.rect, b, "ID:", a.rect.object_id, b.object_id, "Ins:", a.rect.inspect, b.inspect
- b.width = 48
- p a.rect, b, "ID:", a.rect.object_id, b.object_id, "Ins:", a.rect.inspect, b.inspect
- c = a.rect.clone
- a.rect.width = 12
- p a.rect, c, "ID:", c.object_id, "Ins:", c.inspect
- c.width = 48
- p a.rect, c, "ID:", c.object_id, "Ins:", c.inspect
- exit
复制代码 还有 Viewprot不能被clone,并不一定要重载clone方法
如果Viewport定义的ruby类具有const属性, 那么根据const的原则,是不可以存在一个可以感染它的clone实例,也就是Viewport不能被clone的原因
- VALUE
- rb_obj_clone(obj)
- VALUE obj;
- {
- VALUE clone;
- if (rb_special_const_p(obj)) {
- rb_raise(rb_eTypeError, "can't clone %s", rb_obj_classname(obj));
- }
- ... ...
- ... ...
- return clone;
- }
复制代码 以上只是个人理解... 实际还要去看源代码- - |
|