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

Project1

 找回密码
 注册会员
搜索
查看: 3290|回复: 12
打印 上一主题 下一主题

[已经解决] 询问脚本:关于clone和dup

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3288
在线时间
1120 小时
注册时间
2009-4-15
帖子
815
跳转到指定楼层
1
发表于 2013-12-18 10:02:28 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
最近看了随机属性装备的脚本以及菜鸟飞啊飞的无限宠物生成功能有个想法:
就是是否可以使用扩展数据库的功能来实现同一人物无限加入队伍,然后就有以下疑问
RUBY 代码复制
  1. actor = $data_actors(id)
  2. pid = $data_actors.size
  3. $data_actors.insert(pid,actor)

以上代码可以将id号的actor插入数据库,从而可以做到同一人无限加入的现象,我就好奇,如果语句
RUBY 代码复制
  1. $data_actors.insert(pid,actor)

改成
RUBY 代码复制
  1. $data_actors.insert(pid,actor.dup)


RUBY 代码复制
  1. $data_actors.insert(pid,actor.clone)

有什么区别吗?是否达到的目的都一样?(随机属性装备里使用的是dup,为什么?)

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21489
在线时间
9390 小时
注册时间
2012-6-19
帖子
7114

开拓者短篇九导演组冠军

13
发表于 2013-12-18 13:46:46 | 只看该作者
楼上说的很详细了,我再补充一点,dup和clone都会复制对象的污染状态,同时一个能复制冻结状态,另一个不能
当然,对于一个RM的使用者来说,上面两条没有什么了解的必要
回复 支持 反对

使用道具 举报

Lv2.观梦者

狂気の月兔

梦石
0
星屑
256
在线时间
1245 小时
注册时间
2009-4-7
帖子
879

贵宾

12
发表于 2013-12-18 13:02:48 | 只看该作者
如果真的要完全复制一个实例的话, 可以这么写:
  1. Marshal.load(Marshal.dump(object))
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3288
在线时间
1120 小时
注册时间
2009-4-15
帖子
815
11
 楼主| 发表于 2013-12-18 12:56:57 | 只看该作者
铃仙·优昙华院·因幡 发表于 2013-12-18 12:37
因为 dup 和 clone 无法复制类似 字符串啦, 类实例 等变量的引用.

Ruby 里这里东西是用引用地址来保存的 ...

OK,了解,谢谢
回复 支持 反对

使用道具 举报

Lv2.观梦者

狂気の月兔

梦石
0
星屑
256
在线时间
1245 小时
注册时间
2009-4-7
帖子
879

贵宾

10
发表于 2013-12-18 12:37:22 | 只看该作者
tan12345 发表于 2013-12-18 12:33
第一段代码看懂了;
第二段代码疑问:我改的是dup或clone的,为什么原对象(本体)也跟着变了? ...

因为 dup 和 clone 无法复制类似 字符串啦, 类实例 等变量的引用.

Ruby 里这里东西是用引用地址来保存的, 并不是像数字什么的直接保存内容.

所以 代码二 中, 数组里的那个字符串就是引用了.

说白了, 就是那个字符串并没有复制, 而且直接拿来用的.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3288
在线时间
1120 小时
注册时间
2009-4-15
帖子
815
9
 楼主| 发表于 2013-12-18 12:33:37 | 只看该作者
铃仙·优昙华院·因幡 发表于 2013-12-18 12:24
dup 复制只复制 实例 的内容. clone 除了内容, 还可以复制与 实例 有联系的东西, 比如说单例方法.

str = " ...

第一段代码看懂了;
第二段代码疑问:我改的是dup或clone的,为什么原对象(本体)也跟着变了?
回复 支持 反对

使用道具 举报

Lv2.观梦者

狂気の月兔

梦石
0
星屑
256
在线时间
1245 小时
注册时间
2009-4-7
帖子
879

贵宾

8
发表于 2013-12-18 12:24:08 | 只看该作者
dup 复制只复制 实例 的内容. clone 除了内容, 还可以复制与 实例 有联系的东西, 比如说单例方法.

RUBY 代码复制
  1. str = "66"
  2.  
  3. def str.show
  4.   p "77"
  5. end
  6.  
  7. str_clone = str.clone
  8. str_dup = str.dup
  9.  
  10. str_clone.show #=> "77"
  11. str_dup.show   #=> NoMethodError


不过 dup 和 clone 都是浅复制, 对于一些实例有引用的东西, 就不能很好的复制了.
RUBY 代码复制
  1. str = [66, "66"]
  2.  
  3. str_dup = str.dup
  4. str_dup[1][0] = "7"
  5. str_dup[0] = 77
  6. p str #=> [66, "76"]
  7. p str_dup #=> [77, "76"]
  8.  
  9. str = [66, "66"]
  10. str_clone = str.clone
  11. str_clone[1][0] = "7"
  12. str_clone[0] = 77
  13. p str #=> [66, "76"]
  14. p str_dup #=> [77, "76"]

评分

参与人数 1梦石 +1 收起 理由
Sion + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3288
在线时间
1120 小时
注册时间
2009-4-15
帖子
815
7
 楼主| 发表于 2013-12-18 12:20:26 | 只看该作者
无脑之人 发表于 2013-12-18 12:17
应该不会出问题,但是是不必要的,或者说是不该这样做的【降低效率】
按值传递要视情况而定,一般来讲按引 ...

那应该如何改进?可以将代码改一下给我参考吗?谢谢了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
6
发表于 2013-12-18 12:17:45 | 只看该作者
应该不会出问题,但是是不必要的,或者说是不该这样做的【降低效率】
按值传递要视情况而定,一般来讲按引用传递就已经可以了
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3288
在线时间
1120 小时
注册时间
2009-4-15
帖子
815
5
 楼主| 发表于 2013-12-18 12:08:04 | 只看该作者
国产吃货 发表于 2013-12-18 11:36
我的理解是:
$data_actors.insert(pid,actor)
是向$data_actors的pid位后插入actor这个数据

结合RMVA,我可以理解为这3行代码没有区别吗?我这行代码的功能是向数据库actor插入新数据,将id号actor插入到数据库中,对我来讲,只要将对应id号的所有数据(包括名字、职业、初始装备、可用装备等)插入到数据库里就可以了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-10-5 17:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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