我可以在Ruby中合并两个Set对象吗?

EMW*_*EMW 9 ruby merge set

我理解Set类具有合并方法,就像Hash类一样.但是,Set#merge文档说:

将给定可枚举对象的元素合并到集合中并返回self.

似乎合并只能在Set和另一个非Set对象之间进行.是这样的,还是可以合并两套如下?

set1.merge(set2)
Run Code Online (Sandbox Code Playgroud)

Tod*_*obs 16

为什么这个问题很有用

虽然OP因缺乏研究工作而受到批评,但应该指出的是,Set#merge的Ruby文档对于新的Rubyist来说并不友好.从Ruby 2.3.0开始,它说:

将给定可枚举对象的元素合并到集合中并返回self.

它提供merge(enum)了签名,但没有有用的例子.如果你需要知道在Enumerable中混合了什么类,那么很难从这一篇文档中找到可以合并的鸭子类型的鸭子.例如,set.merge {foo: 'bar'}.to_enum尽管它可枚举的,但它会引发SyntaxError :

{foo: 'bar'}.to_enum.class
#=> Enumerator

{foo: 'bar'}.to_enum.class.include? Enumerable
#=> true
Run Code Online (Sandbox Code Playgroud)

合并集

如果您将Set#merge视为创建集合,那么是:您可以合并集合.考虑以下:

require 'set'

set1 = Set.new [1, 2, 3]
#=> #<Set: {1, 2, 3}>

set2 = Set.new [3, 4, 5]
#=> #<Set: {3, 4, 5}>

set1.merge set2
#=> #<Set: {1, 2, 3, 4, 5}>
Run Code Online (Sandbox Code Playgroud)

合并其他可枚举对象,如阵列

但是,您还可以将其他Enumerable对象(如数组)合并到一个集合中.例如:

set = Set.new [1, 2, 3]
#=> #<Set: {1, 2, 3}>

set.merge [3, 4, 5]
#=> #<Set: {1, 2, 3, 4, 5}>
Run Code Online (Sandbox Code Playgroud)

而使用Array Union

当然,你可能根本不需要套装.比较和对比设置为数组联合(数组#|).如果您不需要Set类的实际功能,您通常可以直接使用数组执行类似的操作.例如:

([1, 2, 3, 4] | [3, 4, 5, 6]).uniq
#=> [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)