红宝石套装不是唯一的

hsi*_*ewu 6 ruby set

由于某种原因,以下代码生成具有重复值的集合.
我不确定如何定义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
Run Code Online (Sandbox Code Playgroud)

会打印

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

怎么了?

编辑
变化xs.push xxs + [x]将修复它.

Ste*_*fan 7

您正在有效地更改集合中的对象,这是不允许的.

文档:

Set假定每个元素的标识在存储时不会更改.修改集合的元素会将集合呈现为不可靠状态.


关于你的评论

我想要 #<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]]
Run Code Online (Sandbox Code Playgroud)