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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: 寒冷魔王
打印 上一主题 下一主题

[讨论] 调用数组的函数会损伤原数组

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
11
 楼主| 发表于 2013-8-25 19:43:12 | 只看该作者
无脑之人 发表于 2013-8-23 08:37
是你自己已经将数组进行操作了啊(02行)……
02行的实际操作是
先将array的第0个数据改为0

你说得不错,不过我的意思是08行按理说应该是[3]而不是[0],而返回结果没有异议确实是0
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
12
 楼主| 发表于 2013-8-25 19:45:16 | 只看该作者
无脑之人 发表于 2013-8-23 08:37
是你自己已经将数组进行操作了啊(02行)……
02行的实际操作是
先将array的第0个数据改为0

             请见10L                              

点评

我该怎么吐槽……因为b=a的存在,a和b指向同一个数组,所以对b的操作和对a的操作是相同的,都是修改那个数组,只有FixnumSymbol的=才是复制  发表于 2013-8-25 19:57
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
13
 楼主| 发表于 2013-8-26 11:43:29 | 只看该作者
只能这么等于了
  1. a = [0,1,2]
  2. b = []
  3. for i in 0...a.size
  4.   b[i] = a[i]
  5. end
  6. b[0] = 1
  7. p a #[0,1,2]
  8. p b #[1,1,2]
复制代码

点评

b = a.dup也可以的 clone和dup 就是特别为了复制对象而产生的,详见F1  发表于 2013-8-26 11:46
SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
550
在线时间
1286 小时
注册时间
2011-6-14
帖子
4086
14
发表于 2013-8-26 12:08:08 | 只看该作者
  1. b = a.dup
  2. b = a.clone
  3. b = Marshal.load(Marshal.dump(a)) # 极其奇葩的方法
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3439
在线时间
3054 小时
注册时间
2011-11-17
帖子
980
15
发表于 2013-8-26 14:28:12 | 只看该作者
a=[1,2,3]
a代表了 数组的 首地址
b=a 这时 b和a 值相等 也就是 都是指向了同一片地址
b[0]=0 对b的地址 偏移0个位置 进行节引用 赋值  因为a和b的值 代表的地址相同  所以这时 b可以看做是a的别名 对b的操作会影响到a

a=[1,2,3]
b=a[0]
像这种简单的 元素数组 这时会取出a[0]的值 赋给b 然后 b和a完全没关系了 怎么操作b a都不变

重点是这里
class A
attr_reader   :id   
  def initialize(id)
    @id=id
  end
  def set
    @id*=10
  end
end
a=[]
for i in 1..3
  a.push(A.new(i))
end
b=a[0]
b.set
p a[0].id##30

类对象组成的数组  被取出后 其实也只是取出地址  对b的操作会影响到a


一会影响 一会不影响 其实是RUBY为了方便 自己做的事情 像C里面 都是自定的
简单的int float 这样的数组 复制一份拷贝 花不了多少时间 但是类里面 成员变量大小是未知的 所以复制很消耗效率 于是就取地址了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-29 06:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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