class Set does Setty { }

Set 是一个不可变集合,表示一个不重复元素的集合,没有特定顺序。(对于可变集合,请改用 SetHash。)

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

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

Set 可以使用 { } 后缀运算符作为对象哈希处理,该运算符对作为 set 元素的键返回 True 值,对不是元素的键返回 False

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

创建 Set 对象§

可以使用 set 子例程(或 Set.new,它是该子例程的简写)来组合 Set。任何位置参数(无论其类型如何)都将成为 set 的元素

my $n = set "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))␤»

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

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

此外,可以通过对其他类型(如 List)的对象使用 set 运算符(请参见下一部分)来获取 Set,这些运算符将像在执行操作之前在内部调用 .Set 一样。但请注意这些运算符的优先级很高,这可能要求你在参数周围使用括号

say (1..5(^) 4;  # OUTPUT: «Set(1 2 3 5)␤»

你还可以使用 .new 方法创建 Set

my $fruits = Set.new( <peach apple orange apple apple> );

从 6.d(2019.03 及更高版本)开始,你还可以将此语法用于 Set 的参数化,以指定哪些类型的值是可接受的

# only allow strings (Str) in the Set 
my $fruits = Set[Str].new( <peach apple orange apple apple> );
 
# only allow whole numbers (Int) in the Set 
my $fruits = Set[Int].new( <peach apple orange apple apple> );
# Type check failed in binding; expected Int but got Str ("peach")

最后,你可以通过使用 is 特性来创建伪装成哈希的 Set(实际上,通过使用相应的 sigil 声明一个变量 Associative

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

从 6.d(2019.03 及更高版本)开始,此语法还允许你指定你希望允许的值的类型

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

运算符§

请参阅 具有 set 语义的运算符 以获取适用于 Set 等类型的“set 运算符”的完整列表。

示例

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

子例程§

子例程 set§

sub set(*@args --> Set)

从给定的 @args 创建一个 Set

另请参阅§

Set、Bag 和 Mix

类型图§

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

展开上面的图表