在这里,我试图了解如何Array#shuffle!
处理数组对象。所以我开始在我的IRB
:
[1,2,3]
#=> [1, 2, 3]
[1,2,3].shuffle!
#=> [3, 1, 2]
在上面的代码中,我理解了它是如何工作的。下面我试图用更难的方式从每个角落看到它。
[1,2,5]
#=> [1, 2, 5]
[1,2,5]<<[1,2,5]
#=> [1, 2, 5, [1, 2, 5]]
直到现在我都很好。
[1, 2, 5, [1, 2, 5]].shuffle!
#=> [5, 1, 2, [1, 2, 5]]
使用上面的代码,我感到困惑。所以下面的问题出现在我的脑海中:
(a) 为什么
shuffle!
不递归工作?正如我所料,内部数组的输出[1, 2, 5]
也将被洗牌。但没有发生。(b) 为什么
shuffle!
不对元素数组进行洗牌[1, 2, 5]
,而只1, 2, 5,
对数组的元素有效[1, 2, 5, [1, 2, 5]]
?我认为输出会是[[1, 2, 5],5, 1, 2]
. 那么为什么元素数组没有改变它的位置,而普通元素只改变了它的位置呢?
编辑:
它显示的非常有趣的行为:
a=[1,2,4]
#=> [1, 2, 4]
a<<[7,8]
#=> [1, 2, 4, [7, 8]]
a.shuffle!
#=> [[7, 8], 1, 4, 2]
a.shuffle!
#=> [4, 1, [7, 8], 2]
a.shuffle!
#=> [[7, 8], 2, 1, 4]
irb(main):006:0>
洗牌真的遵循任何顺序还是随机洗牌?