does Setty
Set 是一个不可变集合,表示一个不重复元素的集合,没有特定顺序。(对于可变集合,请改用 SetHash。)
任何类型的对象/值都可以作为集合元素。在 Set 中,每个元素都保证是唯一的(从这个意义上说,没有两个元素会与 === 运算符进行正比较)
my = set <peach apple orange apple apple>;say .elems; # OUTPUT: «3»say .keys.sort; # OUTPUT: «apple orange peach»
Set 可以使用 { } 后缀运算符作为对象哈希处理,该运算符对作为 set 元素的键返回 True 值,对不是元素的键返回 False 值
my = set <peach apple orange apple apple>;say <apple>; # OUTPUT: «True»say <kiwi>; # OUTPUT: «False»
创建 Set 对象§
可以使用 set 子例程(或 Set.new,它是该子例程的简写)来组合 Set。任何位置参数(无论其类型如何)都将成为 set 的元素
my = set "zero" => 0, "one" => 1, "two" => 2;say .keys.raku; # OUTPUT: «(:two(2), :zero(0), :one(1)).Seq»say .keys.map(); # OUTPUT: «((Pair) (Pair) (Pair))»
或者,可以对现有对象调用 .Set 转换器(或其函数形式 Set())以将其转换为 Set。其语义取决于对象的类型和内容。它通常在列表上下文中计算对象并创建一个 set,其中结果项作为元素,但对于类似 Hash 的对象或 Pair 项,只有键成为 set 的元素 - 并且映射到布尔值为 False 的键将被跳过
my = ("zero" => 0, "one" => 1, "two" => 2).Set;say .keys.raku; # OUTPUT: «("one", "two").Seq»say .keys.map(); # OUTPUT: «((Str) (Str))»
此外,可以通过对其他类型(如 List)的对象使用 set 运算符(请参见下一部分)来获取 Set,这些运算符将像在执行操作之前在内部调用 .Set 一样。但请注意这些运算符的优先级很高,这可能要求你在参数周围使用括号
say (1..5) (^) 4; # OUTPUT: «Set(1 2 3 5)»
你还可以使用 .new 方法创建 Set。
my = Set.new( <peach apple orange apple apple> );
从 6.d(2019.03 及更高版本)开始,你还可以将此语法用于 Set 的参数化,以指定哪些类型的值是可接受的
# only allow strings (Str) in the Setmy = Set[Str].new( <peach apple orange apple apple> );# only allow whole numbers (Int) in the Setmy = Set[Int].new( <peach apple orange apple apple> );# Type check failed in binding; expected Int but got Str ("peach")
最后,你可以通过使用 is 特性来创建伪装成哈希的 Set(实际上,通过使用相应的 sigil 声明一个变量 Associative)
my is Set = <a b c>;say <a>; # OUTPUT: «True»say <d>; # OUTPUT: «False»
从 6.d(2019.03 及更高版本)开始,此语法还允许你指定你希望允许的值的类型
# limit to stringsmy is Set[Str] = <a b c>;say <a>; # OUTPUT: «True»say <d>; # OUTPUT: «False»# limit to whole numbersmy is Set[Int] = <a b c>;# Type check failed in binding; expected Int but got Str ("a")
运算符§
请参阅 具有 set 语义的运算符 以获取适用于 Set 等类型的“set 运算符”的完整列表。
示例
my (, ) = set(1, 2, 3), set(2, 4);say (<) ; # OUTPUT: «False»say (&) ; # OUTPUT: «Set(2)»say (^) ; # OUTPUT: «Set(1 3 4)»# Unicode versions:say ⊂ ; # OUTPUT: «False»say ∩ ; # OUTPUT: «Set(2)»say ⊖ ; # OUTPUT: «Set(1 3 4)»
子例程§
子例程 set§
sub set(* --> Set)
从给定的 @args 创建一个 Set
另请参阅§
类型图§
Set 的类型关系