在尝试Euler Project中的问题41时,我遇到了似乎是Array.permutation的Ruby1.9实现中的一个bug。以下是隔离的问题代码:
n = 4
slice = '987654321'.chars.to_a[-n..-1]
puts "slice = #{slice.join}"
slice.permutation(n) {|perm| puts perm.join}
slice2 = slice.dup
puts "slice2 = #{slice2.join}"
slice2.permutation(n) {|perm| puts perm.join}
slice3 = []
(0...n).each {|i| slice3[i] = slice[i]}
puts "slice3 = #{slice3.join}"
slice3.permutation(n) {|perm| puts perm.join}我对slice和slice2的输出是:
slice = 4321
9876
9867
9786
9768
9687
...然而,slice3的结果是正确的,数字1到4被置换了。N=4也是第一个有这个问题的值。当我设置n=3时,我得到了预期的输出。这是个bug,还是我写错了什么?在谷歌上快速搜索一下,什么也没找到。
发布于 2010-08-20 01:12:20
它是1.9.2p136和更高版本中固定的known bug。
除了更新到最新的Ruby之外,最简单的方法就是确保你的数组不是“共享”的,或者通过构建一个新的数组(比如你的slice3),或者简单地“修改”它,比如slice += []。
https://stackoverflow.com/questions/3524215
复制相似问题