does Setty
SetHash 是一个可变集合,即无特定顺序的不同元素的集合。(有关不可变集合,请参阅 Set。)
任何类型的对象/值都可以作为集合元素。在 Set 中,每个元素都保证是唯一的(即没有两个元素会与 === 运算符比较为正值)
my = <peach apple orange apple apple>.SetHash;say .elems; # OUTPUT: «3»say .keys.sort; # OUTPUT: «apple orange peach»
与 Set 一样,SetHash 可以使用 { } 后缀运算符作为对象哈希处理,该运算符对集合元素的键返回 True 值,对非元素的键返回 False 值。
my = <peach apple orange apple apple>.SetHash;say <apple>; # OUTPUT: «True»say <kiwi>; # OUTPUT: «False»
与 Set 不同,SetHash 是可变的。您可以使用 set 方法向 SetHash 添加一个项目或项目列表,并可以使用 unset 方法删除一个项目或项目列表
my = <peach>.SetHash;.set('apple');say ; # OUTPUT: «SetHash(apple peach)».unset('peach');say ; # OUTPUT: «SetHash(apple)».set(<kiwi banana apple>);say ; # OUTPUT: «SetHash(apple banana kiwi)».unset(<apple banana kiwi>);say ; # OUTPUT: «SetHash()»
注意不要将 set 方法(将项目添加到 SetHash)与 Set 方法(将可变 SetHash 转换为不可变 Set)混淆。
作为使用 set 和 unset 方法的替代方法,您还可以通过分配分别布尔化为 True 或 False 的值来添加或删除集合元素
my = <peach apple orange>.SetHash;<apple kiwi> = False, True;say .keys.sort; # OUTPUT: «kiwi orange peach»
以下是一个使用赋值添加和删除 SetHash 元素的便捷简写惯用法
my SetHash .= new;say <cherry>; # OUTPUT: «False»<cherry>++;say <cherry>; # OUTPUT: «True»<apple banana kiwi>»++; # Add multiple elements<cherry>--;say <cherry>; # OUTPUT: «False»<banana kiwi>»--; # Remove multiple elements
创建 SetHash 对象§
可以使用 SetHash.new 编写 SetHash。任何位置参数(无论其类型如何)都成为集合的元素
my = SetHash.new: "zero" => 0, "one" => 1, "two" => 2;say .keys.raku; # OUTPUT: «(:two(2), :zero(0), :one(1)).Seq»say .keys.map(); # OUTPUT: «((Pair) (Pair) (Pair))»
或者,可以对现有对象调用 .SetHash 转换器(或其函数形式 SetHash())以将其转换为 SetHash。其语义取决于对象的类型和内容。通常,它在列表上下文中求值对象,并创建一个集合,其中结果项作为元素,但对于类似哈希的对象或 Pair 项,只有键成为集合的元素,而映射到布尔化为 False 的值的键会被跳过
my = ("zero" => 0, "one" => 1, "two" => 2).SetHash;say .keys.raku; # OUTPUT: «("one", "two").Seq»say .keys.map(); # OUTPUT: «((Str) (Str))»
还可以使用 {} 初始化单个键
my = SetHash.new;= True;= 'Hello World!';= 0; # does not store the key since 0.Bool is Falsesay ; # OUTPUT: «SetHash(key1 key2)»say .keys.raku; # OUTPUT: «("key1", "key2").Seq»
或者,为了同时初始化多个键,请使用列表赋值
my = SetHash.new;= True, False, True;say .keys.raku; # OUTPUT: «("a", "c").Seq»
您还可以使用 is 特性创建伪装成哈希的 SetHash
my is SetHash = <a b c>;say <a>; # OUTPUT: «True»say <d>; # OUTPUT: «False»
从 6.d(2019.03 及更高版本)开始,还可以指定您希望在 SetHash 中允许的值类型。这可以在调用 .new 时完成
# only allow Pairsmy = SetHash[Pair].new: "zero" => 0, "one" => 1, "two" => 2;
或使用伪装语法
# only allow stringsmy is SetHash[Str] = <a b c>;say <a>; # OUTPUT: «True»say <d>; # OUTPUT: «False»# only allow whole numbersmy is SetHash[Int] = <a b c>;# Type check failed in binding; expected Int but got Str ("a")
运算符§
有关适用于 SetHash 等类型的“集合运算符”的完整列表,请参阅 具有集合语义的运算符。
示例
my (, ) = SetHash.new(1, 2, 3), SetHash.new(2, 4);say (<) ; # OUTPUT: «False»say (&) ; # OUTPUT: «SetHash(2)»say (^) ; # OUTPUT: «SetHash(1 3 4)»say (|) ; # OUTPUT: «SetHash(1 2 3 4)»# Unicode versions:say ⊂ ; # OUTPUT: «False»say ∩ ; # OUTPUT: «SetHash(2)»say ⊖ ; # OUTPUT: «SetHash(1 3 4)»say ∪ ; # OUTPUT: «SetHash(1 2 3 4)»
方法§
方法 set§
method set(SetHash: \to-set --> Nil)
当给定单个键时,set 将其添加到 SetHash 中。当给定 List、Array、Seq 或任何其他“执行”Iterator 角色的类型时,set 将 Iterator 的每个元素作为键添加到 SetHash 中。
注意:自 2020.02 版本起。
方法 unset§
method unset(SetHash: \to-unset --> Nil)
当给定单个键时,unset 将其从 SetHash 中移除。当给定 List、Array、Seq 或任何其他“执行”Iterator 角色的类型时,unset 将 Iterator 的每个元素从 SetHash 中移除(如果它作为键存在)。
注意:自 2020.02 版本起。
另请参阅§
类型图§
SetHash 的类型关系