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