Project1

标题: 关于push命令 [打印本页]

作者: 最后的信徒    时间: 2012-10-21 04:10
标题: 关于push命令
本帖最后由 最后的信徒 于 2012-10-21 19:14 编辑

不知道各位有没有遇到过这样的事
请你先猜猜以下代码所输出的值
然后自己运行看看
  1. a = []
  2. b = []
  3. b[0]=0
  4. for i in 1..5
  5.   b[1]=rand(5)
  6.   a.push(b)
  7.   p a
  8. end
复制代码
请再看6楼
作者: 电锤斧王    时间: 2012-10-21 08:48
我猜是0
作者: 电锤斧王    时间: 2012-10-21 08:59
楼主呢回来啊速度
作者: serena718    时间: 2012-10-21 12:42
b[1] 沒定義,應該是nil吧?
作者: 电锤斧王    时间: 2012-10-21 17:45
serena718 发表于 2012-10-21 12:42
b[1] 沒定義,應該是nil吧?

我不同意 我没试验如果你实验了好吧我服了
作者: 最后的信徒    时间: 2012-10-21 18:10
本帖最后由 最后的信徒 于 2012-10-21 18:18 编辑

@电锤斧王@serena718
输出结果有5个,
第一次循环:假设b[1]=1,则输出[[0,1]]
第二次循环:假设b[1]=2,则输出[[0,2],[0,2]]           》》》》为什么不是[[0,1],[0,2]]呢???!!!
......
由此可见,第一次循环所"push"的值,被后面的值更新了。


要不我们改改代码
  1. a=[]
  2. b=[]
  3. b[0]=0
  4. for i in 1..5
  5. b[1]=i
  6. a.push(b)
  7. p a
  8. end
复制代码
理想输出的值:
[[0,1]]
[[0,1],[0,2]]
[[0,1],[0,2],[0,3]]
[[0,1],[0,2],[0,3],[0,4]]
[[0,1],[0,2],[0,3],[0,4],[0,5]]

实际输出的值:
[[0,1]]
[[0,2],[0,2]]
[[0,3],[0,3],[0,3]]
[[0,4],[0,4],[0,4],[0,4]]
[[0,5],[0,5],[0,5],[0,5],[0,5]]



为什么会这样呢????

作者: 电锤斧王    时间: 2012-10-21 19:27
我对ruby的数组不是很了解 其他人看看吧
作者: serena718    时间: 2012-10-21 19:28
因為那個循環把b[1]重新刷新了
在push時並不會記錄到前一次的值
試試這樣,我沒測試過,不過你要的結果可能必須用到clone
a = []
b = []
b[0]=0
for i in 1..5
  c = b.clone
  b[1]= i
  a.push(c) if i > 1
  a.push(b)
  p a
end
作者: feizhaodan    时间: 2012-10-21 20:00
数组保存的可以算是C++里的pointer而不是那个数值。
  1. a = 1
  2. b = [a]
  3. p b
  4. a += 1
  5. p b
复制代码
就是这么简单。
作者: pigsss    时间: 2012-10-21 20:04
push的对象是引用,你对原数组b修改,那push进的所有b都会变,因为指向的都是一个对象
想要理想的效果就像楼上说的那样,但是有错 应该是:
a = []
b = []
b[0]=0
for i in 1..5
  c = b.clone
  c[1]= i
  a.push(c)
  p a
end
作者: 英顺的马甲    时间: 2013-1-6 22:20
  1. a = []
  2. for i in 1..5
  3.   for n in 1..i
  4.     a.push([0,n])
  5.   end
  6. end
  7. p *a
复制代码





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