In List§
有关routine classify,请参阅主要文档 in context
multi method classify(, :!, :)multi method classify(, :)multi classify(, +items, :!, * )multi classify(, +items, * )
将值列表转换为表示这些值分类的哈希;每个哈希键表示一个或多个传入列表值的分类,并且相应的哈希值包含已分类到关联键的类别的那些列表值数组。$test
将是一个表达式,它将根据元素将要被分类的标准生成哈希键。
示例
say classify , (1, 7, 6, 3, 2);# OUTPUT: «{even => [6 2], odd => [1 7 3]}»say ('hello', 1, 22/7, 42, 'world').classify: ;# OUTPUT: «{1 => [1], 2 => [42], 5 => [hello world], 8 => [3.142857]}»
它还可以将 :as
作为命名参数,在对其进行分类之前转换该值
say <Innie Minnie Moe>.classify( , :as);# OUTPUT: «{3 => [moe], 5 => [innie], 6 => [minnie]}»
此代码按字符数进行分类,这是作为 $test
参数传递的表达式,但 :as
块在执行转换之前将其小写。命名参数 :into
还可以用于对新定义的变量进行分类
<Innie Minnie Moe>.classify( , :as, :into( my ) );say ; # 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(, :!, :)multi method classify(, :)multi classify(, +items, :!, * )multi classify(, +items, * )
第一个形式总是会失败。第二个形式对给定对象的标识进行分类,通常只有与 :&as
参数结合使用才有意义。
其余部分包括一个 $test
参数,它是一个函数,将为每个输入返回一个标量;这些将用作哈希的键,其值将是为测试函数输出该键的元素的数组。
my = (2003..2008).map( );.classify( *.is-leap-year , into => my );say ;# 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
作为测试的支持。