class SetHash does Setty { }

SetHash 是一个可变集合,即无特定顺序的不同元素的集合。(有关不可变集合,请参阅 Set。)

任何类型的对象/值都可以作为集合元素。在 Set 中,每个元素都保证是唯一的(即没有两个元素会与 === 运算符比较为正值)

my $fruits = <peach apple orange apple apple>.SetHash;
 
say $fruits.elems;      # OUTPUT: «3␤» 
say $fruits.keys.sort;  # OUTPUT: «apple orange peach␤» 

Set 一样,SetHash 可以使用 { } 后缀运算符作为对象哈希处理,该运算符对集合元素的键返回 True 值,对非元素的键返回 False 值。

my $fruits = <peach apple orange apple apple>.SetHash;
 
say $fruits<apple>;     # OUTPUT: «True␤» 
say $fruits<kiwi>;      # OUTPUT: «False␤» 

Set 不同,SetHash 是可变的。您可以使用 set 方法向 SetHash 添加一个项目或项目列表,并可以使用 unset 方法删除一个项目或项目列表

my $fruits = <peach>.SetHash;
$fruits.set('apple');
say $fruits;            # OUTPUT: «SetHash(apple peach)␤» 
 
$fruits.unset('peach');
say $fruits;            # OUTPUT: «SetHash(apple)␤» 
 
$fruits.set(<kiwi banana apple>);
say $fruits;            # OUTPUT: «SetHash(apple banana kiwi)␤» 
 
$fruits.unset(<apple banana kiwi>);
say $fruits;            # OUTPUT: «SetHash()␤» 

注意不要将 set 方法(将项目添加到 SetHash)与 Set 方法(将可变 SetHash 转换为不可变 Set)混淆。

作为使用 setunset 方法的替代方法,您还可以通过分配分别布尔化为 TrueFalse 的值来添加或删除集合元素

my $fruits = <peach apple orange>.SetHash;
 
$fruits<apple kiwi> = FalseTrue;
say $fruits.keys.sort;  # OUTPUT: «kiwi orange peach␤» 

以下是一个使用赋值添加和删除 SetHash 元素的便捷简写惯用法

my SetHash $fruits .= new;
say $fruits<cherry>;      # OUTPUT: «False␤» 
$fruits<cherry>++;
say $fruits<cherry>;      # OUTPUT: «True␤» 
$fruits<apple banana kiwi>»++# Add multiple elements 
 
$fruits<cherry>--;
say $fruits<cherry>;      # OUTPUT: «False␤» 
$fruits<banana kiwi>»--# Remove multiple elements 

创建 SetHash 对象§

可以使用 SetHash.new 编写 SetHash。任何位置参数(无论其类型如何)都成为集合的元素

my $n = SetHash.new: "zero" => 0"one" => 1"two" => 2;
say $n.keys.raku;        # OUTPUT: «(:two(2), :zero(0), :one(1)).Seq␤» 
say $n.keys.map(&WHAT);  # OUTPUT: «((Pair) (Pair) (Pair))␤»

或者,可以对现有对象调用 .SetHash 转换器(或其函数形式 SetHash())以将其转换为 SetHash。其语义取决于对象的类型和内容。通常,它在列表上下文中求值对象,并创建一个集合,其中结果项作为元素,但对于类似哈希的对象或 Pair 项,只有键成为集合的元素,而映射到布尔化为 False 的值的键会被跳过

my $n = ("zero" => 0"one" => 1"two" => 2).SetHash;
say $n.keys.raku;        # OUTPUT: «("one", "two").Seq␤» 
say $n.keys.map(&WHAT);  # OUTPUT: «((Str) (Str))␤»

还可以使用 {} 初始化单个键

my $sh = SetHash.new;
$sh{ 'key1' } = True;
$sh{ 'key2' } = 'Hello World!';
$sh{ 'key3' } = 0;  # does not store the key since 0.Bool is False 
say $sh;            # OUTPUT: «SetHash(key1 key2)␤» 
say $sh.keys.raku;  # OUTPUT: «("key1", "key2").Seq␤»

或者,为了同时初始化多个键,请使用列表赋值

my $sh = SetHash.new;
$sh{ 'a''b''c' } = TrueFalseTrue;
say $sh.keys.raku;  # OUTPUT: «("a", "c").Seq␤»

您还可以使用 is 特性创建伪装成哈希的 SetHash

my %sh is SetHash = <a b c>;
say %sh<a>;  # OUTPUT: «True␤» 
say %sh<d>;  # OUTPUT: «False␤»

从 6.d(2019.03 及更高版本)开始,还可以指定您希望在 SetHash 中允许的值类型。这可以在调用 .new 时完成

# only allow Pairs 
my $n = SetHash[Pair].new: "zero" => 0"one" => 1"two" => 2;

或使用伪装语法

# only allow strings 
my %sh is SetHash[Str= <a b c>;
say %sh<a>;  # OUTPUT: «True␤» 
say %sh<d>;  # OUTPUT: «False␤» 
 
# only allow whole numbers 
my %sh is SetHash[Int= <a b c>;
# Type check failed in binding; expected Int but got Str ("a")

运算符§

有关适用于 SetHash 等类型的“集合运算符”的完整列表,请参阅 具有集合语义的运算符

示例

my ($a$b= SetHash.new(123), SetHash.new(24);
 
say $a (<) $b;  # OUTPUT: «False␤» 
say $a (&) $b;  # OUTPUT: «SetHash(2)␤» 
say $a (^) $b;  # OUTPUT: «SetHash(1 3 4)␤» 
say $a (|) $b;  # OUTPUT: «SetHash(1 2 3 4)␤» 
 
# Unicode versions: 
say $a  $b;  # OUTPUT: «False␤» 
say $a  $b;  # OUTPUT: «SetHash(2)␤» 
say $a  $b;  # OUTPUT: «SetHash(1 3 4)␤» 
say $a  $b;  # OUTPUT: «SetHash(1 2 3 4)␤» 

方法§

方法 set§

method set(SetHash:D: \to-set --> Nil)

当给定单个键时,set 将其添加到 SetHash 中。当给定 ListArraySeq 或任何其他“执行”Iterator 角色的类型时,setIterator 的每个元素作为键添加到 SetHash 中。

注意:自 2020.02 版本起。

方法 unset§

method unset(SetHash:D: \to-unset --> Nil)

当给定单个键时,unset 将其从 SetHash 中移除。当给定 ListArraySeq 或任何其他“执行”Iterator 角色的类型时,unsetIterator 的每个元素从 SetHash 中移除(如果它作为键存在)。

注意:自 2020.02 版本起。

另请参阅§

集合、包和混合

类型图§

SetHash 的类型关系
raku-type-graph SetHash SetHash Any Any SetHash->Any Setty Setty SetHash->Setty Mu Mu Any->Mu Associative Associative QuantHash QuantHash QuantHash->Associative Setty->QuantHash

展开上面的图表