【问题标题】:Can I merge two Set objects in Ruby?我可以在 Ruby 中合并两个 Set 对象吗?
【发布时间】:2016-02-10 10:04:25
【问题描述】:

我了解Set class 与 Hash 类一样具有合并方法。但是,Set#merge documentation 说:

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

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

set1.merge(set2)

【问题讨论】:

  • 为什么不自己试试呢?
  • 虽然 OP 缺乏努力可能是一个有效的批评,但在辩护中应该指出,文档说“将给定可枚举对象的元素合并到集合并返回 self”。并提供merge(enum) 作为签名。这对于可以合并什么样的鸭子还不是很清楚。
  • 别忘了使用集合和Set方法时,一定要require 'set'
  • @CodeGnome 感谢您的欢迎和理解并意识到我可能已经自己研究和尝试过(就像我一样)。感谢您改进问题。正如您所指出的,文档不清楚,因为我尝试了它并且无法做我想做的事情 - 我在这里发布了这个问题,所以比我更有经验的其他人可以阐明我不知道的任何捷径或方法。这个问题并不是因为缺乏努力,尽管我很欣赏了解什么是合适的问题,什么不是合适的问题。

标签: ruby merge set


【解决方案1】:

为什么这个问题很有用

虽然 OP 因缺乏研究工作而受到批评,但应该指出Set#merge 的 Ruby 文档对新的 Ruby 主义者并不友好。从 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

合并集

如果您将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]

【讨论】:

  • 另一个数据点:require 'set'; [1,2,3].to_set.merge({ a: 3, b: 4 }) #=&gt; #&lt;Set: {1, 2, 3, [:a, 3], [:b, 4]}&gt;.
  • @CarySwoveland 很好的例子,虽然我会将它调整为 [1,2,3].to_set.merge({ a: 3, b: 4 }.values) 以保持 Set 数字。但是解析器可能会对集合感到非常困惑。由于 Set#merge 没有块形式,[1,2,3].to_set.merge {a: 3, b: 4} 应该可以工作,但不能,即使{a: 3, b: 4}.class &lt; Enumerable #=&gt; true。我的猜测是 Set 库需要一些 TLC。
猜你喜欢
  • 2018-01-28
  • 2016-10-29
  • 2018-12-11
  • 2016-11-05
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多