简介§
六个集合类是 Set、SetHash、Bag、BagHash、Mix 和 MixHash。它们都具有相似的语义。
简而言之,这些类通常包含无序的对象集合,类似于一个对象哈希。 QuantHash角色是所有这些类实现的角色:因此它们也被称为QuantHashes。
Set和SetHash也实现了Setty角色,Bag和BagHash实现了Baggy角色,Mix和MixHash实现了Mixy角色(它本身实现了Baggy角色)。
集合只考虑集合中对象的存在与否,包可以包含多个相同类型的对象,而混合还允许分数(和负数)权重。常规版本是不可变的,-Hash版本是可变的。
让我们详细说明一下。如果您想将对象收集到一个容器中,但您不关心这些对象的顺序,Raku 提供了这些无序集合类型。由于是无序的,这些容器在查找元素或处理重复项方面可能比Lists 或Arrays 更有效率。
另一方面,如果您想获取没有重复的包含对象(元素),并且您只关心元素是否在集合中,您可以使用Set或SetHash.
如果您想消除重复但仍然保留顺序,请查看unique例程,用于List.
如果您想跟踪每个对象出现的次数,您可以使用Bag或BagHash。在这些Baggy容器中,每个元素都有一个权重(一个无符号整数),表示相同对象在集合中包含的次数。
类型Mix和MixHash类似于Bag和BagHash,但它们也允许分数和负数权重。
Set,Bag和Mix是不可变类型。如果您想在容器构建后添加或删除元素,请使用可变变体SetHash,BagHash和MixHash.
首先,就它们而言,相同的对象指的是同一个元素 - 其中身份是使用WHICH方法确定的(即与===运算符检查身份的方式相同)。对于像Str这样的值类型,这意味着具有相同的值;对于像Array这样的引用类型,这意味着引用同一个对象实例。
其次,它们提供了一个类似哈希的接口,其中集合的实际元素(可以是任何类型的对象)是“键”,关联的权重是“值”。
| $a 的类型 | 如果 $b 是一个元素,则 $a{$b} 的值 | 如果 $b 不是一个元素,则 $a{$b} 的值 |
|---|---|---|
| Set / SetHash | True | False |
| Bag / BagHash | 一个正整数 | 0 |
| Mix / MixHash | 一个非零实数 | 0 |
具有集合语义的运算符§
有几个中缀运算符专门用于使用QuantHash语义执行常见操作。由于这是一个很长的词,这些运算符通常被称为“集合运算符”。
这并不意味着这些运算符的参数必须始终是Set,甚至是一个更通用的QuantHash。它只是意味着应用于运算符的逻辑是集合论的逻辑。
这些中缀可以使用表示函数的 Unicode 字符(如 ∈ 或 ∪)或等效的 ASCII 版本(如 (elem) 或 (|))来编写。
因此,显式地使用Set(或Bag或Mix)对象与这些中缀一起使用是不必要的。所有集合运算符都适用于所有可能的参数,包括(从 6.d 开始)那些不是显式集合类型的参数。如果需要,内部会进行强制转换:但在许多情况下,实际上并不需要。
但是,如果Bag或Mix是这些集合运算符的参数之一,则语义将升级到该类型(如果两种类型都使用,则Mix优先于Bag)。
返回Bool§的集合运算符
中缀 (elem),中缀 ∈§
如果 $a 是 $b 的元素,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix ∉§
如果 $a 不是 $b 的元素,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix (cont), infix ∋§
如果 $a 包含 $b 作为元素,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix ∌§
如果 $a 不包含 $b,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix (<=), infix ⊆§
如果 $a 是 $b 的子集或等于 $b,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix ⊈§
如果 $a 不是 $b 的子集也不等于 $b,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix (<), infix ⊂§
如果 $a 是 $b 的真子集,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix ⊄§
如果 $a 不是 $b 的真子集,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix (>=), infix ⊇§
如果 $a 是 $b 的超集或等于 $b,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix ⊉§
如果 $a 不是 $b 的超集也不等于 $b,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix (>), infix ⊃§
如果 $a 是 $b 的真超集,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix ⊅§
如果 $a 不是 $b 的真超集,则返回 True,否则返回 False。 更多信息,维基百科定义.
infix (==), infix ≡§
如果 $a 和 $b 相同,则返回 True,否则返回 False。 更多信息,维基百科定义.
从 2020.07 Rakudo 编译器版本开始可用。使用旧版 Rakudo 的用户可以安装 Set::Equality 模块以获得相同的功能。
infix ≢§
如果 $a 和 $b 不相同,则返回 True,否则返回 False。 更多信息,维基百科定义.
从 2020.07 Rakudo 编译器版本开始可用。使用旧版 Rakudo 的用户可以安装 Set::Equality 模块以获得相同的功能。
返回 QuantHash§ 的集合运算符
infix (|), infix ∪§
infix (&), infix ∩§
infix (-), infix ∖§
infix (^), infix ⊖§
返回 Baggy§
infix (.), infix ⊍§
返回参数的 Baggy 乘法。 更多信息.
infix (+), infix ⊎§
返回参数的 Baggy 加法。 更多信息.