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

Project1

 找回密码
 注册会员
搜索
查看: 9667|回复: 10
打印 上一主题 下一主题

[讨论] 关于push命令

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
46 小时
注册时间
2011-9-13
帖子
55
跳转到指定楼层
1
发表于 2012-10-21 04:10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 最后的信徒 于 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楼

Lv1.梦旅人

梦石
0
星屑
47
在线时间
366 小时
注册时间
2012-10-6
帖子
221
2
发表于 2012-10-21 08:48:26 | 只看该作者
我猜是0
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
47
在线时间
366 小时
注册时间
2012-10-6
帖子
221
3
发表于 2012-10-21 08:59:50 | 只看该作者
楼主呢回来啊速度
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
122
在线时间
1740 小时
注册时间
2009-7-12
帖子
443
4
发表于 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

那啥…我以為用戶名只是通行碼…
所以我暱稱不是serena718哈,是月見斐夜
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
47
在线时间
366 小时
注册时间
2012-10-6
帖子
221
5
发表于 2012-10-21 17:45:51 | 只看该作者
serena718 发表于 2012-10-21 12:42
b[1] 沒定義,應該是nil吧?

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
46 小时
注册时间
2011-9-13
帖子
55
6
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
47
在线时间
366 小时
注册时间
2012-10-6
帖子
221
7
发表于 2012-10-21 19:27:07 | 只看该作者
我对ruby的数组不是很了解 其他人看看吧
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
122
在线时间
1740 小时
注册时间
2009-7-12
帖子
443
8
发表于 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

那啥…我以為用戶名只是通行碼…
所以我暱稱不是serena718哈,是月見斐夜
回复 支持 反对

使用道具 举报

Lv1.梦旅人

Mr.Gandum

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

贵宾

9
发表于 2012-10-21 20:00:16 | 只看该作者
数组保存的可以算是C++里的pointer而不是那个数值。
  1. a = 1
  2. b = [a]
  3. p b
  4. a += 1
  5. p b
复制代码
就是这么简单。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1641
在线时间
2205 小时
注册时间
2010-6-27
帖子
1299
10
发表于 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

于是我也广告下…
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-24 19:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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