在 Supply 中§
参阅主要文档 在上下文中 了解方法 unique
method unique(Supply: :, :, : --> Supply)
创建一个仅提供唯一值的供应,由可选的 :as
和 :with
参数定义(与 unique
相同)。可选的 :expires
参数指定在“重置”之前等待多长时间(以秒为单位),即使它与旧值相同,也不将值视为已看到。
在 Any 中§
参阅主要文档 在上下文中 了解方法 unique
multi method unique()multi method unique( :!, :! )multi method unique( :! )multi method unique( :! )
创建一个唯一元素序列,如果作为 sub
调用,则为对象或 values
。
<1 2 2 3 3 3>.unique.say; # OUTPUT: «(1 2 3)»say unique <1 2 2 3 3 3>; # OUTPUT: «(1 2 3)»
:as
和 :with
参数接收用于在检查相等性之前转换项目和用于检查相等性的函数,因为默认情况下使用 ===
运算符
("1", 1, "1 ", 2).unique( as => Int, with => &[==] ).say; # OUTPUT: «(1 2)»
请参阅 unique
以获取使用其子表单的其他示例。
在独立例程中§
参阅主要文档 在上下文中 了解例程 unique
multi unique(+values, |c)
从调用者/参数列表中返回一个唯一值序列,使得每个重复值的第一次出现保留在结果列表中。unique
使用 === 运算符的语义来决定两个对象是否相同,除非指定了可选的 :with
参数并指定了另一个比较器。即使删除了重复项,也会保留原始列表的顺序。
示例
say <a a b b b c c>.unique; # OUTPUT: «(a b c)»say <a b b c c b a>.unique; # OUTPUT: «(a b c)»
(如果你知道输入已按相同对象相邻的顺序排序,请改用 squish。)
可选的 :as
参数允许你在唯一化之前对元素进行规范化/标准化。这些值会为了比较的目的而转换,但最终进入结果列表的仍然是原始值;但是,只有第一次出现的值才会显示在该列表中
示例
say <a A B b c b C>.unique(:as()) # OUTPUT: «(a B c)»
你还可以使用可选的 :with
参数指定比较器。例如,如果想要一个唯一哈希列表,可以使用 eqv
比较器。
示例
my = %(a => 42), %(b => 13), %(a => 42);say .unique(:with(&[eqv])) # OUTPUT: «({a => 42} {b => 13})»
注意:由于 :with
Callable
必须与列表中的所有项目一起尝试,这使得 unique
遵循算法复杂性更高的路径。在可能的情况下,你应该尝试使用 :as
参数。