class Set

Set 类实现了一个不包含重复元素的无序集合。它融合了 Array 直观的互操作性和 Hash 快速查找的优点。

Set 易于与 Enumerable 对象(实现 each)配合使用。大多数初始化方法和二元运算符除了接受 Set 和 Array 外,还可以接受通用的 Enumerable 对象。可以使用 to_set 方法将 Enumerable 对象转换为 Set。

Set 在内部使用类似于 Hash 的数据结构进行存储,但它只存储键而没有值。

比较

比较运算符 <><=>= 是 {proper_,}{subset?,superset?} 方法的简写。<=> 运算符反映了这种顺序,或者对于同时包含不同元素的 Set(例如 {x, y} vs. {x, z})返回 nil

示例

s1 = Set[1, 2]                        #=> Set[1, 2]
s2 = [1, 2].to_set                    #=> Set[1, 2]
s1 == s2                              #=> true
s1.add("foo")                         #=> Set[1, 2, "foo"]
s1.merge([2, 6])                      #=> Set[1, 2, "foo", 6]
s1.subset?(s2)                        #=> false
s2.subset?(s1)                        #=> true

联系方式

继承 Set

在 Ruby 4.0(发布于 2025 年 12 月)之前,Set 有一个不同的、效率较低的实现。它被重写为 C 语言,并且一些核心方法的行为也进行了调整。

为了保持向后兼容性,当一个类继承自 Set 时,会额外包含 Set::SubclassCompatible 模块,这使得继承类的行为以及内部方法名称更接近 Ruby 4.0 之前的状态。

例如,这在 inspect 方法的行为中很容易看出。

p Set[1, 2, 3]
# prints "Set[1, 2, 3]"

class MySet < Set
end
p MySet[1, 2, 3]
# prints "#<MySet: {1, 2, 3}>", like it was in Ruby 3.4

对于新代码,如果不需要向后兼容性,建议继承 Set::CoreSet,它避免了包含“兼容性”层。

class MyCoreSet < Set::CoreSet
end
p MyCoreSet[1, 2, 3]
# prints "MyCoreSet[1, 2, 3]"

Set 的方法

首先,其他地方的方法。类 Set

特别是,类 Set 本身并没有很多用于获取或迭代的方法。相反,它依赖于 Enumerable 中的方法。

这里,类 Set 提供了对以下方面有用的方法:

创建 Set 的方法

Set 操作的方法

比较方法

查询方法

赋值方法

删除方法

转换方法

迭代方法

其他方法