代码之家  ›  专栏  ›  技术社区  ›  chenyf

Supply和普通Array中具有Empty值的映射函数的行为不一致?

  •  1
  • chenyf  · 技术社区  · 4 年前

    最近,我一直在学习Swift的Combine框架。

    用苹果的话说:

    Combine框架为您的应用程序提供了一种声明性方法 处理事件。而不是潜在地实现多个 委托回调或完成处理程序闭包,您可以创建 给定事件源的单个处理链。 链是一个联合运算符,它对 从上一步骤接收的元素。

    在Combine中,有一个名为 compactMap ,可以过滤零值:

    import Combine
    
    let strings = ["a", "1.24", "3", "def", "45", "0.23"].publisher
    
    strings
      .compactMap { Float($0) }
      .sink(receiveValue: {
        print($0)
      })
      .store(in: &subscriptions)
    )
    

    compactMap in Swift

    我在Raku中将上述代码重写如下:

    my @strings = ["a", "1.24", "3", "def", "45", "0.23"];
    my Supply $supply = Supply.from-list(@strings);
    my Supply $compact = $supply.map(-> $value {
      try { Num($value) }
      if $! { Empty } else { Num($value) }
     }); # .grep(Num);
    
    $compact.tap(
        &say,
        done => { say 'finished' },
        quit => { say 'done'     }
    );
    
    # ()   <--
    # 1.24
    # 3
    # ()   <--
    # 45
    # 0.23
    

    但它也输出两个空括号。当在普通数组上使用贴图而不是在Supply上使用贴图时,会过滤具有Empty值的贴图:

    my @strings = ["a", "1.24", "3", "def", "45", "0.23"];
    
    my @compacted = @strings.map(-> $value {
        try { Num($value) }
        if $! { Empty } else { Num($value) }
    });
    
    .say for @compacted;
    
    # 1.24
    # 3
    # 45
    # 0.23
    

    是的行为 map 函数 空的 中的值 Supply 和平原 Array 不一致的

    0 回复  |  直到 4 年前
        1
  •  7
  •   librasteve    4 年前

    为什么不这样做。。。

    my @strings = ["a", "1.24", "3", "def", "45", "0.23"];
    
    my $supply = Supply.from-list(@strings);
    my $compact = $supply.grep(*.Num.so);
    $compact.tap(&say);
    
    # 1.24
    # 3
    # 45
    # 0.23
    

    我同意,与常规grep(不需要)相比,似乎有一个小的分歧(与故障处理有关)。。。

    say @strings.grep(*.Num);
    #(1.24 3 45 0.23)