2017-06-14 49 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