Project1

标题: 调用数组的函数会损伤原数组 [打印本页]

作者: 寒冷魔王    时间: 2013-8-6 19:07
标题: 调用数组的函数会损伤原数组
方才编脚本时,发现只在函数中修改调用充当参数的数组,原数组也会改变,当然目前只发现调用array[id]=的时候才出现这种情况
调式结果出乎意料……无论是XP还是VX……{:2_263:} {:2_263:}
  1. def ch_array(array)
  2.   return array[0] = 0
  3. end

  4. a=[3]
  5. p a  #结果:[3]
  6. d = ch_array(a)
  7. p a  #结果:[0]
  8. p d  #结果:0
复制代码

作者: 寒冷魔王    时间: 2013-8-6 19:09
我是说08行的那个,按理说应该也是[3]啊啊啊{:2_272:}{:2_272:}{:2_272:}{:2_272:}{:2_272:}
作者: Algalon    时间: 2013-8-7 00:29
这没什么奇怪啊。。在方法里修改变量本身会改变的
作者: SuperMario    时间: 2013-8-7 06:37
都指向一个数组实例,印象里除了Numeric都是这样的。可以clone或dup一下。
作者: gonglinyuan    时间: 2013-8-13 20:48
如果RUBY和C语言系列一样的话,
数组应该是传指针的吧,不然系统执行时还得把整个数组重新复制一遍,效率十分低下
作者: DeathKing    时间: 2013-8-15 12:48
为什么不会呢?语句array[0]=的意图就是要修改原数组索引为0号元素的值。
作者: satgo1546    时间: 2013-8-15 13:02
第二行改成return array[0] == 0即可。ruby中=是赋值而==是相等。
作者: hqltc    时间: 2013-8-15 13:34
def ch_array(array)
  return array[0] = 0
end
你这是将这个数组(array)的第一个元素赋值为零,然后再return这个为零的值
已经在修改数组存放的数据了,类似c/c++的带地址操作
作者: 无脑之人    时间: 2013-8-23 08:37
是你自己已经将数组进行操作了啊(02行)……
02行的实际操作是
先将array的第0个数据改为0
然后返回array的第0个数据【好吧我承认返回=左边还是右边的我忘记了……都一样啦=-=】
如果LZ想要判定array[0]是否等于0 那么请用==
如果LZ想要返回array[0] 那么=0部分请去掉
作者: 寒冷魔王    时间: 2013-8-25 19:40
不调用函数也会损伤
RUBY 代码复制
  1. a = [0,1,2]
  2. b = a
  3. b[0] = 1
  4. p a #[1,1,2]
  5. p b #[1,1,2]

作者: 寒冷魔王    时间: 2013-8-25 19:43
无脑之人 发表于 2013-8-23 08:37
是你自己已经将数组进行操作了啊(02行)……
02行的实际操作是
先将array的第0个数据改为0

你说得不错,不过我的意思是08行按理说应该是[3]而不是[0],而返回结果没有异议确实是0
作者: 寒冷魔王    时间: 2013-8-25 19:45
无脑之人 发表于 2013-8-23 08:37
是你自己已经将数组进行操作了啊(02行)……
02行的实际操作是
先将array的第0个数据改为0

             请见10L                              
作者: 寒冷魔王    时间: 2013-8-26 11:43
只能这么等于了
  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]
复制代码

作者: satgo1546    时间: 2013-8-26 12:08
  1. b = a.dup
  2. b = a.clone
  3. b = Marshal.load(Marshal.dump(a)) # 极其奇葩的方法
复制代码

作者: yagami    时间: 2013-8-26 14:28
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 这样的数组 复制一份拷贝 花不了多少时间 但是类里面 成员变量大小是未知的 所以复制很消耗效率 于是就取地址了





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1