在列表中§

有关例程 categorize 的主要文档,请参阅上下文中的

multi method categorize()
multi method categorize(Whatever)
multi method categorize($test:$into!:&as)
multi method categorize($test:&as)
multi        categorize($test+items:$into!*%named )
multi        categorize($test+items*%named )

这些方法直接继承自 Any;有关更多示例,请参阅 Any.list

此例程将值列表转换为表示这些值根据 $test 进行分类的哈希,$test 对列表中的每个元素调用一次;每个哈希键表示一个或多个传入列表值的一种可能分类,对应的哈希值包含由 $test 分类到关联键的类别中的那些列表值的数组,其作用类似于映射器。

请注意,与 classify 不同,后者假设映射器的返回值是单个值,而 categorize 始终假设映射器的返回值是适合当前值的类别列表。

示例

sub mapper(Int $ireturns List {
    $i %% 2 ?? 'even' !! 'odd',
    $i.is-prime ?? 'prime' !! 'not prime'
}
say categorize &mapper, (17632);
# 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($test:$into!:&as)
multi method categorize($test:&as)
multi        categorize($test+items:$into!*%named )
multi        categorize($test+items*%named )

第一种形式将始终失败。第二种形式根据给定对象的标识进行分类,这通常只有与 :&as 参数结合使用才有意义。

在其最简单的形式中,它使用 $test,其结果将用作键;键的值将是由测试产生该键结果的元素数组。

say (1..13).categorize* %% 3);
say categorize* %% 31..13)
# OUTPUT: «{False => [1 2 4 5 7 8 10 11 13], True => [3 6 9 12]}␤» 

:as 参数将在分类之前进行标准化

say categorize* %% 3-5..5as => &abs )
# OUTPUT: «{False => [5 4 2 1 1 2 4 5], True => [3 0 3]}␤» 

$into 关联参数可用于放置结果,而不是返回新的 Hash

my %leap-years;
my @years = (2002..2009).map{ Date.new$_~"-01-01" ) } );
@years.categorize*.is-leap-year , into => %leap-years );
say %leap-years
# 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-byInt $n --> Array(Seq) ) {
    gather {
        for <2 3 5 7> {
            take $_ if $n %% $_;
        }
    }
}
 
say (3..13).categorize&divisible-by );
# OUTPUT: 
# «{2 => [4 6 8 10 12], 3 => [3 6 9 12], 5 => [5 10], 7 => [7]}␤» 

在这种情况下,范围内的每个数字都被分类到尽可能多的箱中,具体取决于它可以被多少个数整除。

在 Rakudo 编译器 2023.02 版本中添加了对使用 Whatever 作为测试的支持。