如何在Raku中对列表元素分组?是否支持类似groupBy的getter分组方法?
Raku 中的分组功能(对应 Scala/Lodash 的 groupBy)
Raku 原生提供了classify方法,完全实现了你需要的分组功能——传入一个用于提取分组键的逻辑(对应你说的 getter),将列表中该逻辑返回相同值的元素归为一组,效果和 Scala、Lodash 的groupBy完全一致。
基础示例(对应你给出的例子)
用 Raku 实现按模3分组:
(1..9).classify(* % 3)
返回结果:
Map(0 => (3, 6, 9), 1 => (1, 4, 7), 2 => (2, 5, 8))
补充说明
classify接收一个代码块作为参数,这个代码块就是你的分组依据逻辑,它会被应用到列表的每个元素上,返回值作为分组的键- 返回的是
Map类型,键是分组键的值,值是对应分组的元素列表,且元素保持原列表中的顺序
另外,Raku 还提供了group-by方法,它是classify的别名,用法完全相同:
(1..9).group-by(* % 3)
复杂场景示例(按对象属性分组)
如果要对自定义对象按属性分组,同样简单:
class Person { has $.name; has $.age-group; } my @people = Person.new(name => 'Alice', age-group => 'young'), Person.new(name => 'Bob', age-group => 'adult'), Person.new(name => 'Charlie', age-group => 'young'); @people.classify(*.age-group)
返回结果:
Map(young => (Person<Alice>, Person<Charlie>), adult => (Person<Bob>))
内容的提问来源于stack exchange,提问作者menfon
相关产品推荐
相关产品推荐

