Ruby 1.9的bug? - Array.permutation

Gre*_*les 5 ruby

在尝试来自Euler Project的问题41时,我遇到了似乎是Array.permutation的Ruby 1.9实现中的一个错误.这是隔离的问题代码:

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}
Run Code Online (Sandbox Code Playgroud)

我对slice和slice2的输出是:

slice = 4321
9876
9867
9786
9768
9687
...
Run Code Online (Sandbox Code Playgroud)

但是,slice3出现正确,数字1到4被置换.此外,n = 4是第一个出现此问题的值.当我设置n = 3时,我得到预期的输出.这是一个错误,还是我错误的编码?快速谷歌搜索没有发现任何东西.

Mar*_*une 6

这是一个已知的错误,修复于1.9.2p136及更新版本.

除了更新到更新的Ruby之外,最简单的方法是确保您的阵列不是"共享",无论是通过构建一个新的(如slice3),还是简单地"修改"它,例如slice += [].

  • 甜蜜,谢谢!我的日语有点生疏......没等,是什么呢?哦,对,不存在.但是我可以从该链接的代码中看到它是同一个问题.我想我不会是第一个注意到它的人,尽管我并没有错过太多.现在我很好奇bug是如何发生的.我无法想象允许切片看似正确的内部数据结构,但是使排列出错,但对于三个切片却没问题.在任何地方都有英语讨论吗? (3认同)