查看: 4146|回复: 12

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

[复制链接]
梦石
0
星屑
3348
在线时间
1120 小时
注册时间
2009-4-15
回帖
761
发表于 2013-12-18 10:02:28 | 显示全部楼层 |阅读模式

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

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

×
最近看了随机属性装备的脚本以及菜鸟飞啊飞的无限宠物生成功能有个想法:
就是是否可以使用扩展数据库的功能来实现同一人物无限加入队伍,然后就有以下疑问
[pre lang="ruby" line="1"]actor = $data_actors(id)
pid = $data_actors.size
$data_actors.insert(pid,actor)[/pre]
以上代码可以将id号的actor插入数据库,从而可以做到同一人无限加入的现象,我就好奇,如果语句
[pre lang="ruby" line="1"]$data_actors.insert(pid,actor)[/pre]
改成
[pre lang="ruby" line="1"]$data_actors.insert(pid,actor.dup)[/pre]
或
[pre lang="ruby" line="1"]$data_actors.insert(pid,actor.clone)[/pre]
有什么区别吗?是否达到的目的都一样?(随机属性装备里使用的是dup,为什么?)
梦石
0
星屑
55
在线时间
218 小时
注册时间
2013-12-17
回帖
368
发表于 2013-12-18 11:25:34 | 显示全部楼层
本帖最后由 国产吃货 于 2013-12-18 11:28 编辑
  1. clone
  2. dup
  3. 生成物件的副本。clone 返回对象的完整副本,包括冻结状态和特殊方法。而 dup 只有复制对象内容而已。
  4. 注意,clone 和 dup 执行的是简单复制。所复制的是对象本身,而不是对象所指的对象(例如数组元素)。
  5. 复制的对象
复制代码
以上来自Object 物件类的定义[所有类的超类,定义了一般对象的行为。]

评分

参与人数 1星屑 +100 收起 理由
Sion + 100 感谢帮忙

查看全部评分

RM脚本定制/修改/整合 群:143356012(入群注明来意)
回复

使用道具 举报

梦石
0
星屑
3348
在线时间
1120 小时
注册时间
2009-4-15
回帖
761
 楼主| 发表于 2013-12-18 11:30:24 | 显示全部楼层
国产吃货 发表于 2013-12-18 11:25
以上来自Object 物件类的定义[所有类的超类,定义了一般对象的行为。]

能结合我的代码具体解释吗?这段解释我看过了的,可是还不是很理解。而且我主要想问
$data_actors.insert(pid,actor)和$data_actors.insert(pid,actor.clone)和$data_actors.insert(pid,actor.dup)的区别
回复

使用道具 举报

梦石
0
星屑
55
在线时间
218 小时
注册时间
2013-12-17
回帖
368
发表于 2013-12-18 11:36:55 | 显示全部楼层
tan12345 发表于 2013-12-18 11:30
能结合我的代码具体解释吗?这段解释我看过了的,可是还不是很理解。而且我主要想问
$data_actors.insert ...

我的理解是:
$data_actors.insert(pid,actor)
是向$data_actors的pid位后插入actor这个数据
$data_actors.insert(pid,actor.dup)
$data_actors.insert(pid,actor.clone)
是向$data_actors的pid位后插入actor这个数据的翻版
但是我估计,就算你重复多次运行
$data_actors.insert(pid,actor)
也会重复多次的插入。
  1. insert(nth, [val[, val2 ...]])
  2. 在第 nth 个元素前面插入第二个参数以及后面的所有参数。
复制代码
上面是数组类insert方法的解释。
如此看来,插入是可以无限制的插入,不存在数据重复就不能插入的问题。
(本吃货也是菜鸟,如果有不对的地方,各位撸过的大神一定要及时修正啊呜)
RM脚本定制/修改/整合 群:143356012(入群注明来意)
回复

使用道具 举报

梦石
0
星屑
3348
在线时间
1120 小时
注册时间
2009-4-15
回帖
761
 楼主| 发表于 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号的所有数据(包括名字、职业、初始装备、可用装备等)插入到数据库里就可以了
回复

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

狂気の月兔

梦石
0
星屑
421
在线时间
1245 小时
注册时间
2009-4-7
回帖
866

贵宾

发表于 2013-12-18 12:24:08 | 显示全部楼层
dup 复制只复制 实例 的内容. clone 除了内容, 还可以复制与 实例 有联系的东西, 比如说单例方法.

[pre lang="ruby" line="1"]str = "66"

def str.show
  p "77"
end

str_clone = str.clone
str_dup = str.dup

str_clone.show #=> "77"
str_dup.show   #=> NoMethodError [/pre]

不过 dup 和 clone 都是浅复制, 对于一些实例有引用的东西, 就不能很好的复制了.
[pre lang="ruby" line="1"]str = [66, "66"]

str_dup = str.dup
str_dup[1][0] = "7"
str_dup[0] = 77
p str #=> [66, "76"]
p str_dup #=> [77, "76"]

str = [66, "66"]
str_clone = str.clone
str_clone[1][0] = "7"
str_clone[0] = 77
p str #=> [66, "76"]
p str_dup #=> [77, "76"]
[/pre]

评分

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

查看全部评分

回复

使用道具 举报

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

str = " ...

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

使用道具 举报

狂気の月兔

梦石
0
星屑
421
在线时间
1245 小时
注册时间
2009-4-7
回帖
866

贵宾

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

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

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

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

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

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部