我理解Set class具有合并方法,就像Hash类一样。但是,Set#merge documentation说:
将给定可枚举对象的元素合并到集合中并返回self。
似乎合并只能在Set和另一个非Set对象之间进行。是这种情况,还是可以合并两套如下?
CorsMiddleware
答案 0 :(得分:14)
虽然OP因缺乏研究工作而受到批评,但应该指出Set#merge的Ruby文档对新Rubyists不友好。从Ruby 2.3.0开始,它说:
将给定可枚举对象的元素合并到集合中并返回self。
它提供merge(enum)
作为签名,但没有有用的示例。如果你需要知道Enumerable中哪些类混合,可能很难从这一篇文档中找到可以合并的鸭型鸭。例如,set.merge {foo: 'bar'}.to_enum
会引发语法错误,尽管 可枚举:
{foo: 'bar'}.to_enum.class
#=> Enumerator
{foo: 'bar'}.to_enum.class.include? Enumerable
#=> true
如果您认为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}>
但是,您也可以将其他Enumerable对象(如数组)合并到一个集合中。例如:
set = Set.new [1, 2, 3]
#=> #<Set: {1, 2, 3}>
set.merge [3, 4, 5]
#=> #<Set: {1, 2, 3, 4, 5}>
当然,你根本不需要套装。比较和对比设置为数组联合(Array#|)。如果您不需要Set类的实际功能,您通常可以直接使用数组执行类似的操作。例如:
([1, 2, 3, 4] | [3, 4, 5, 6]).uniq
#=> [1, 2, 3, 4, 5, 6]