简介§
六个集合类是 Set
、SetHash
、Bag
、BagHash
、Mix
和 MixHash
。它们都具有相似的语义。
简而言之,这些类通常包含无序的对象集合,类似于一个对象哈希。 QuantHash
角色是所有这些类实现的角色:因此它们也被称为QuantHash
es。
Set
和SetHash
也实现了Setty
角色,Bag
和BagHash
实现了Baggy
角色,Mix
和MixHash
实现了Mixy
角色(它本身实现了Baggy
角色)。
集合只考虑集合中对象的存在与否,包可以包含多个相同类型的对象,而混合还允许分数(和负数)权重。常规版本是不可变的,-Hash版本是可变的。
让我们详细说明一下。如果您想将对象收集到一个容器中,但您不关心这些对象的顺序,Raku 提供了这些无序集合类型。由于是无序的,这些容器在查找元素或处理重复项方面可能比List
s 或Array
s 更有效率。
另一方面,如果您想获取没有重复的包含对象(元素),并且您只关心元素是否在集合中,您可以使用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 加法。 更多信息.