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 版本起。