在列表中§
有关例程 categorize 的主要文档,请参阅上下文中的
multi method categorize()multi method categorize(Whatever)multi method categorize(, :!, :)multi method categorize(, :)multi categorize(, +items, :!, * )multi categorize(, +items, * )
这些方法直接继承自 Any
;有关更多示例,请参阅 Any.list
。
此例程将值列表转换为表示这些值根据 $test
进行分类的哈希,$test
对列表中的每个元素调用一次;每个哈希键表示一个或多个传入列表值的一种可能分类,对应的哈希值包含由 $test
分类到关联键的类别中的那些列表值的数组,其作用类似于映射器。
请注意,与 classify 不同,后者假设映射器的返回值是单个值,而 categorize
始终假设映射器的返回值是适合当前值的类别列表。
示例
sub mapper(Int ) returns Listsay categorize , (1, 7, 6, 3, 2);# OUTPUT: «{even => [6 2], not prime => [1 6], odd => [1 7 3], prime => [7 3 2]}»
在任何地方§
请参阅上下文中的主要文档,了解例程 categorize
multi method categorize()multi method categorize(Whatever)multi method categorize(, :!, :)multi method categorize(, :)multi categorize(, +items, :!, * )multi categorize(, +items, * )
第一种形式将始终失败。第二种形式根据给定对象的标识进行分类,这通常只有与 :&as
参数结合使用才有意义。
在其最简单的形式中,它使用 $test
,其结果将用作键;键的值将是由测试产生该键结果的元素数组。
say (1..13).categorize( * %% 3);say categorize( * %% 3, 1..13)# OUTPUT: «{False => [1 2 4 5 7 8 10 11 13], True => [3 6 9 12]}»
:as
参数将在分类之前进行标准化
say categorize( * %% 3, -5..5, as => )# OUTPUT: «{False => [5 4 2 1 1 2 4 5], True => [3 0 3]}»
$into
关联参数可用于放置结果,而不是返回新的 Hash
。
my ;my = (2002..2009).map( );.categorize( *.is-leap-year , into => );say# OUTPUT:# «{ False# => [2002-01-01 2003-01-01 2005-01-01 2006-01-01 2007-01-01 2009-01-01],# True => [2004-01-01 2008-01-01]}»
用于分类的函数可以返回一个数组,指示其参数可以放入的所有可能的箱。
sub divisible-by( Int --> Array(Seq) )say (3..13).categorize( );# OUTPUT:# «{2 => [4 6 8 10 12], 3 => [3 6 9 12], 5 => [5 10], 7 => [7]}»
在这种情况下,范围内的每个数字都被分类到尽可能多的箱中,具体取决于它可以被多少个数整除。
在 Rakudo 编译器 2023.02 版本中添加了对使用 Whatever
作为测试的支持。