查看: 11446|回复: 10

[讨论] 关于push命令

[复制链接]
梦石
0
星屑
50
在线时间
46 小时
注册时间
2011-9-13
回帖
46
发表于 2012-10-21 04:10:19 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 最后的信徒 于 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楼
梦石
0
星屑
47
在线时间
366 小时
注册时间
2012-10-6
回帖
188
发表于 2012-10-21 08:48:26 | 显示全部楼层
我猜是0
回复

使用道具 举报

梦石
0
星屑
47
在线时间
366 小时
注册时间
2012-10-6
回帖
188
发表于 2012-10-21 08:59:50 | 显示全部楼层
楼主呢回来啊速度
回复

使用道具 举报

梦石
0
星屑
687
在线时间
1808 小时
注册时间
2009-7-12
回帖
416
发表于 2012-10-21 12:42:26 | 显示全部楼层
b[1] 沒定義,應該是nil吧?

点评

噢,懂了,出來的結果是 a =[[b[0],b[1]]]......  发表于 2012-10-21 14:00
原來數組是從0開始不是從nil開始嗎??  发表于 2012-10-21 13:55
回复

使用道具 举报

梦石
0
星屑
47
在线时间
366 小时
注册时间
2012-10-6
回帖
188
发表于 2012-10-21 17:45:51 | 显示全部楼层
serena718 发表于 2012-10-21 12:42
b[1] 沒定義,應該是nil吧?

我不同意 我没试验如果你实验了好吧我服了
回复

使用道具 举报

梦石
0
星屑
50
在线时间
46 小时
注册时间
2011-9-13
回帖
46
 楼主| 发表于 2012-10-21 18:10:48 | 显示全部楼层
本帖最后由 最后的信徒 于 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]]



为什么会这样呢????

点评

b[1] = i 这句话,已经把原来的b[1]覆盖了。而在数组里push 的是b ,而不是[0,i]。  发表于 2012-11-8 10:05
clone 返回该对象的浅拷贝  发表于 2012-10-24 19:01
回复

使用道具 举报

梦石
0
星屑
47
在线时间
366 小时
注册时间
2012-10-6
回帖
188
发表于 2012-10-21 19:27:07 | 显示全部楼层
我对ruby的数组不是很了解 其他人看看吧
回复

使用道具 举报

梦石
0
星屑
687
在线时间
1808 小时
注册时间
2009-7-12
回帖
416
发表于 2012-10-21 19:28:18 | 显示全部楼层
因為那個循環把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
回复

使用道具 举报

Mr.Gandum

梦石
0
星屑
226
在线时间
2070 小时
注册时间
2007-1-31
回帖
2982

贵宾

发表于 2012-10-21 20:00:16 | 显示全部楼层
数组保存的可以算是C++里的pointer而不是那个数值。
  1. a = 1
  2. b = [a]
  3. p b
  4. a += 1
  5. p b
复制代码
就是这么简单。
回复

使用道具 举报

梦石
0
星屑
1691
在线时间
2205 小时
注册时间
2010-6-27
回帖
1259
发表于 2012-10-21 20:04:48 | 显示全部楼层
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

点评

clone是什么命令?  发表于 2012-10-24 16:56

于是我也广告下…
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部