由于某种原因,以下代码生成具有重复值的集合.
我不确定如何定义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 x来xs + [x]将修复它.
您正在有效地更改集合中的对象,这是不允许的.
从文档:
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)