最近,我一直在学习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)
)
我在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
不一致的