0

这个问题有点含糊,但我不确定为什么会发生这种情况:

我有以下代码:

p user.room.users.length
user.room.users.each {|usr| puts "b" }
user.room.users.each {|usr| puts "a"; usr.enter(Room[Config::entrance]) }

输出:

5
b
b
b
b
b
a
a
a

我还让 User#enter 计算它被调用的次数并返回3!我对这种行为完全感到困惑。我怀疑 User#enter 中的代码是原因,但如果有人认为它可能相关,我可以提供它(我不想不必要地混淆问题)。


编辑

如果它是相关的,我正在使用ruby-1.9.3-p125

4

2 回答 2

7

当您在迭代集合时更改集合时,通常会发生这种行为。因此,如果usr.enter修改user.room.user将解释您所看到的行为。

于 2012-07-01T21:11:37.200 回答
2

正如@sepp2k 所说,大概usr.enter是在修改user.room.users. 虽然我从未看过源代码,但Array#each似乎可以通过维护当前元素的内部索引并在每次迭代后递增该索引来工作(事实上,这是它唯一可行的合理方式

所以说你从 开始[1,2,3],在第一次迭代中#each,你删除了第一个元素。对于第二次迭代,它将产生数组的第二个元素,但现在数组是[2,3],所以第二个元素是3。所以你会错过一个元素。

于 2012-07-01T21:58:24.730 回答