In List§

有关routine classify,请参阅主要文档 in context

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

将值列表转换为表示这些值分类的哈希;每个哈希键表示一个或多个传入列表值的分类,并且相应的哈希值包含已分类到关联键的类别的那些列表值数组。$test 将是一个表达式,它将根据元素将要被分类的标准生成哈希键。

示例

say classify { $_ %% 2 ?? 'even' !! 'odd' }, (17632);
# OUTPUT: «{even => [6 2], odd => [1 7 3]}␤» 
say ('hello'122/742'world').classify: { .Str.chars };
# OUTPUT: «{1 => [1], 2 => [42], 5 => [hello world], 8 => [3.142857]}␤»

它还可以将 :as 作为命名参数,在对其进行分类之前转换该值

say <Innie Minnie Moe>.classify{ $_.chars }:as{ lc $_ });
# OUTPUT: «{3 => [moe], 5 => [innie], 6 => [minnie]}␤»

此代码按字符数进行分类,这是作为 $test 参数传递的表达式,但 :as 块在执行转换之前将其小写。命名参数 :into 还可以用于对新定义的变量进行分类

<Innie Minnie Moe>.classify{ $_.chars }:as{ lc $_ }:intomy %words{Int} ) );
say %words# OUTPUT: «{3 => [moe], 5 => [innie], 6 => [minnie]}␤»

我们正在动态声明 %words{Int} 的作用域,其键实际上是整数;它使用分类结果创建。

In Any§

有关routine classify,请参阅主要文档 in context

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

第一个形式总是会失败。第二个形式对给定对象的标识进行分类,通常只有与 :&as 参数结合使用才有意义。

其余部分包括一个 $test 参数,它是一个函数,将为每个输入返回一个标量;这些将用作哈希的键,其值将是为测试函数输出该键的元素的数组。

my @years = (2003..2008).map{ Date.new$_~"-01-01" ) } );
@years.classify*.is-leap-year , into => my %leap-years );
say %leap-years;
# OUTPUT: «{False => [2003-01-01 2005-01-01 2006-01-01 2007-01-01], 
#           True => [2004-01-01 2008-01-01]}␤» 

.categorize 类似,元素可以通过使用 :as 参数传递的 Callable 进行规范化,并且可以使用 :into 命名参数传递 Hash 将结果分类到其中;在上面的示例中,它是动态定义的。

从 6.d 版本开始,.classify 也将适用于 Junction

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