设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 沉影不器
打印 上一主题 下一主题

[已经解决] 关于Viewport的诡异测试

 关闭 [复制链接]

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

11
发表于 2009-9-18 23:10:52 | 只看该作者
本帖最后由 link006007 于 2009-9-18 23:19 编辑

哦  我在看看...

另外
str的id一样 是因为
像ruby这种高级语言 他们对字符串的处理都是用一个叫做"字符串常量池"的东西在维护.
即相同的字符串,他们其实引用的是一个字符串内存.. 这个和Java相似.
s1和s2应该是不一样的吧...
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
12
发表于 2009-9-18 23:24:08 | 只看该作者
1、s1 和 s2 当然不一样,但是它们引用到的是一个对象,如果深层拷贝的话,他们引用的就应该是不同的对象
2、那你就错了,Java 的确有常量池,其字符串有保留(intern)机制,但 Ruby 没有~
  1. p "hello".id, "hello".id
复制代码
这里就生成了两个一模一样的 "hello",完全没有全局唯一性,只有取值范围在 31 位带符号整数之内的整型 Ruby 对象才有全局唯一性:
  1. p 1.id, 1.id
复制代码
3、是的,所以 Rect 的基本数据类型按理说应该可以直接浅层拷贝(而不是像拷贝字符串成员那样拷贝对象的地址),但这贴引出的问题则推翻了这个说法……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

13
发表于 2009-9-18 23:45:03 | 只看该作者
本帖最后由 link006007 于 2009-9-19 00:15 编辑

  ..是没有常量池... ...
我误解了不知道有多久呢... ...
我记得Ruby在定义String的结构体时,有一个shared字段... 还以为那是常量池...

不过ls知道... 为什么str.clone仅仅只是引用么?

  1. a = "hello"
  2. b = a.clone
  3. p a.object_id, b.object_id, "hello".object_id, "hello".clone.object_id
复制代码
这里的都不一样-  -
到是和Viewport的Rect挺像...
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
14
发表于 2009-9-19 00:18:32 | 只看该作者
本帖最后由 紫苏 于 2009-9-19 00:39 编辑

str.clone 之后就不是克隆引用,而是克隆值了啊~
你之前克隆的是一个包含了 String 类型成员变量的类实例,浅层拷贝后拷贝的是 str 的引用,所以当修改这个 str 本身的时候,就会反映到所有这个对象的引用那里;str.clone 后当然就是真实的克隆体了(实际上深层拷贝就是递归去调用所有成员的 clone 方法)
  1. s1 = "hello"
  2. s2 = s1.clone

  3. s2 << " world"

  4. p s1, s2
复制代码
那四个对象,第一个是 a,第二个是 a 的克隆,第三个又是一个新的字符串对象了(尽管其内容和前面完全一样,但解释器一旦发现引号就会分配对象),第四个又是克隆,自然都不一样……

虽然 Ruby 的浮点数和长整数类型的实例也不具有唯一性,但直接浅层拷贝也可以,因为这些对象本身都是常量,是不可修改的,这就和 Java 的 String 一样了。即便内存中的常量存储区中有多份相同的拷贝,只要随便指向其中一个就行了,因为程序只需要它的值,而不关心他在内存中算老几,哦呵呵呵呵~

关于深层克隆,有兴趣可以参考:
http://rpg.blue/viewthread.php?tid=131787&highlight=clone
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

15
发表于 2009-9-19 00:27:35 | 只看该作者
哦 我看错了
那个Klass是s1.clone 不是 s1.str.clone = =
我已开始就没搞对 T_T
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3137
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

16
发表于 2009-9-19 08:42:55 | 只看该作者
总结结论就是……EB干了坏事吗囧
还是觉得就是临时对象在捣鬼= =
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
17
发表于 2009-9-19 08:56:20 | 只看该作者
讨论的问题有点深奥=.=看不懂,飘过。=.=
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

18
 楼主| 发表于 2009-9-19 23:10:18 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
19
发表于 2009-9-20 21:09:24 | 只看该作者
指针存储在栈上,拷贝的时候直接拷贝栈上的值,结果就是拷贝了指针指向的对象在堆中的地址,这就好像在 Java 中浅层克隆对象时,克隆了栈上的引用一样~

C 扩展的 RGSS 类,也就只有 Font 的几个类变量是 Ruby 变量了……
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

20
 楼主| 发表于 2009-9-20 22:02:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-6 19:58

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表