2017-06-14 48 views
6

由於某些原因,以下代碼會生成一個具有重複值的集合。
我不確定數組在ruby中的唯一性是如何定義的,所以這可能是可以預期的?紅寶石集不是唯一的

require 'set' 
xs = [1, 2, 3] 
xss = Set.new [] 
xs.each do |x| 
    xss.merge xss.to_a.map{|xs| xs.push x} 
    xss.add [x] 
    p xss 
end 

將打印

#<Set: {[1]}> 
#<Set: {[1, 2], [1, 2], [2]}> 
#<Set: {[1, 2, 3, 3], [1, 2, 3, 3], [2, 3], [1, 2, 3, 3], [2, 3], [3]}> 

有什麼不對?

編輯
更改xs.push xxs + [x]將解決它。

+0

什麼是你想要做什麼呢? –

+0

@ sagarpandya82任意長度的組合 – hsinewu

+0

所以你需要'#? –

回答

7

您正在有效地改變集合內的對象,這是不允許的。

documentation

設置假定它是存儲,而每個元素的身份不會改變。修改集合中的一個元素會使集合處於不可靠狀態。


關於你comment

我想#<Set: {[1], [1, 2], [2], [1, 3], [1, 2, 3], [2, 3], [3]}>

你可以使用Array#combination

a = [1, 2, 3] 

(1..a.size).flat_map { |n| a.combination(n).to_a } 
#=> [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]] 
+0

所以這是因爲推方法改變元素值,從而打破狀態?什麼是正確的做法,而不是推? – hsinewu

+0

我想我明白了,謝謝! – hsinewu