【问题标题】:Can I modify values as I classify a Perl 6 list?我可以在对 Perl 6 列表进行分类时修改值吗?
【发布时间】:2017-07-07 17:02:32
【问题描述】:

List.classify 方法可以通过我定义的一些映射将列表转换为哈希。该映射的结果是哈希键和原始值

my @list = (
    <Camelia 5>,
    <Camelia 6>,
    <Camelia 7>,
    <Amelia 1>,
    <Amelia 2>,
    <Amelia 3>
    );

my %hash = @list.classify: *.[0];

say %hash;

哈希值是列表的列表,因为它分类的原始事物是列表:

{
Amelia => [(Amelia 1) (Amelia 2) (Amelia 3)],
Camelia => [(Camelia 5) (Camelia 6) (Camelia 7)]
}

但是,我真的很想要这个:

{
Amelia => ( 1 2 3 ),
Camelia => ( 5 6 7 )
}

我可以做一些额外的工作,但这似乎有点太多了:

my @list = (
    <Camelia 5>,
    <Camelia 6>,
    <Camelia 7>,
    <Amelia 1>,
    <Amelia 2>,
    <Amelia 3>
    );

my %hash = @list
    .classify( *.[0] )
    .kv
    .map( {
        $^a => $^b.map: *.[*-1]
        } )
    ;

say %hash;

【问题讨论】:

    标签: list hash raku


    【解决方案1】:

    你可以使用:as副词:

    my @list = (
        <Camelia 5>,
        <Camelia 6>,
        <Camelia 7>,
        <Amelia 1>,
        <Amelia 2>,
        <Amelia 3>
        );
    
    my %hash = @list.classify: *.[0], as => *.[1];
    
    say %hash;  # {Amelia => [1 2 3], Camelia => [5 6 7]}
    

    (不幸的是,它似乎还不是documented。)

    【讨论】:

    • 我知道一定有什么!
    【解决方案2】:

    还有另一个未记录的副词:into,我认为主要是在Hash 中有一个适配器到classify-list(尽管方法名称中带有“列表”的东西应该在List 中):

    my @list = (
        <Camelia 5>,
        <Camelia 6>,
        <Camelia 7>,
        <Amelia 1>,
        <Amelia 2>,
        <Amelia 3>
        );
    
    @list.classify: *.[0], :into(my %hash), :as( *.[1] );
    
    say %hash;
    

    它的这种形式似乎更有意义,但这也是你不使用:into 副词时得到的。我认为那里有两个哈希:

     my %hash = Hash.new.classify-list: *.[0], @list, :as( *.[1] );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多