在 Supply 中§

参阅主要文档 在上下文中 了解方法 unique

method unique(Supply:D: :$as:$with:$expires --> Supply:D)

创建一个仅提供唯一值的供应,由可选的 :as:with 参数定义(与 unique 相同)。可选的 :expires 参数指定在“重置”之前等待多长时间(以秒为单位),即使它与旧值相同,也不将值视为已看到。

在 Any 中§

参阅主要文档 在上下文中 了解方法 unique

multi method unique()
multi method unique:&as!:&with! )
multi method unique:&as! )
multi method unique:&with! )

创建一个唯一元素序列,如果作为 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""2).uniqueas => Intwith => &[==] ).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(&lc))      # OUTPUT: «(a B c)␤»

你还可以使用可选的 :with 参数指定比较器。例如,如果想要一个唯一哈希列表,可以使用 eqv 比较器。

示例

my @list = %(=> 42), %(=> 13), %(=> 42);
say @list.unique(:with(&[eqv]))           # OUTPUT: «({a => 42} {b => 13})␤»

注意:由于 :with Callable 必须与列表中的所有项目一起尝试,这使得 unique 遵循算法复杂性更高的路径。在可能的情况下,你应该尝试使用 :as 参数。