我很难理解supply {…}
区块的用途/他们创造的按需供应。
实时供应(即来自 aSupplier
并在发出值时获取新值的类型Supplier
)对我来说很有意义 - 它们是异步流的一种版本,我可以使用它来将消息从一个或多个发送者广播到一个发送者或更多接收器。很容易看到响应实时消息流的用例:我可能希望每次从 GUI 界面获得 UI 事件或每次聊天应用程序广播它已收到新消息时都执行操作。
但是按需供应没有类似的意义。文档说_
点播就像 Netflix:每个开始流式传输电影(点击供应)的人,总是从头开始(获取所有值),无论现在有多少人正在观看。
好,可以。但是我为什么/什么时候需要这些语义?
这些例子也让我有点摸不着头脑。Concurancy 页面当前提供了三个块示例,但其中两个只是从循环中supply
发出值。for
第三个更详细一点:
my $bread-supplier = Supplier.new;
my $vegetable-supplier = Supplier.new;
my $supply = supply {
whenever $bread-supplier.Supply {
emit("We've got bread: " ~ $_);
};
whenever $vegetable-supplier.Supply {
emit("We've got a vegetable: " ~ $_);
};
}
$supply.tap( -> $v { say "$v" });
$vegetable-supplier.emit("Radish"); # OUTPUT: «We've got a vegetable: Radish»
$bread-supplier.emit("Thick sliced"); # OUTPUT: «We've got bread: Thick sliced»
$vegetable-supplier.emit("Lettuce"); # OUTPUT: «We've got a vegetable: Lettuce»
在那里,supply
块正在做某事。具体来说,它对两个不同 (live) 的输入做出反应,Supplier
然后将它们合并为一个Supply
. 这似乎相当有用。
...除了如果我想转换两个Supplier
s 的输出并将它们的输出合并到一个组合流中,我可以使用
my $supply = Supply.merge:
$bread-supplier.Supply.map( { "We've got bread: $_" }),
$vegetable-supplier.Supply.map({ "We've got a vegetable: $_" });
而且,确实,如果我用上面的/替换该supply
示例中的块,我会得到完全相同的输出。此外,如果将移到对 的调用下方,块版本和/版本都不会产生任何输出,这表明块的“按需”方面在这里并没有真正发挥作用。map
merge
supply
map
merge
tap
.emit
supply
在更一般的层面上,我不相信 Raku (或Cro)文档提供了任何块的示例,该supply
块不是以某种方式转换实时输出Supply
或基于for
循环或发射值Supply.interval
。Supply
除了作为转换s的不同方式之外,这些似乎都不是特别引人注目的用例 。
鉴于上述所有情况,我很想将supply
块作为一个不是那么有用的构造,除了作为某些Supply
组合器的可能替代语法之外。然而,我有相当好的权威,
虽然供应商经常被联系到,但很多时候最好编写一个发出值的供应块。
鉴于此,我愿意冒险一个相当自信的猜测,即我错过了一些关于supply
积木的东西。我将不胜感激任何洞察这可能是什么。