最近,我一直在学习SWIFT的联合框架.
用苹果公司的话说,"Combine框架为应用程序如何处理事件提供了一种声明性方法.您可以为给定的事件源创建单个处理链,而不是潜在地实现多个委托回调或完成处理程序闭包.链的每个部分都是一个Combine运算符,它对从上一步接收的元素执行不同的操作."
在Combine中,有一个名为compactMap
的函数,它可以过滤nil值:
import Combine
let strings = ["a", "1.24", "3", "def", "45", "0.23"].publisher
strings
.compactMap { Float($0) }
.sink(receiveValue: {
print($0)
})
.store(in: &subscriptions)
)
我用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
但它也会输出两个空括号.当在平面数组上而不是在供应上使用贴图时,值为空的贴图将被过滤:
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
Supply
中值为Empty的map
函数和普通Array
中的函数行为是否不一致?