gpt4 book ai didi

concurrency - Perl6 制作一个可观察的计时器

转载 作者:行者123 更新时间:2023-12-04 16:42:08 25 4
gpt4 key购买 nike

我正在尝试使用计时器类编写观察者模式,该类以给定的时间间隔调用其订阅者。一直在尝试理解 Perl6 中的 Promise 概念。

class Timer does Observable
{
has Promise $!p;
has Int $!interval;
has Bool $!active = False;

submethod BUILD(Int :$!interval) {}

method start {
$!p = Promise.start( {
$!active = True;
loop {
sleep($!interval);
@!action_listeners>>.actionPerformed(ActionEvent.new);
if !$!active {$!p.keep}
}
});
}

method stop {
$!active = False;
}
}

观察者角色只是有一个带有订阅者的数组。当然,我应该制定一种方法来更新角色内的所有订阅者。
role Observable {
has ActionListener @!action_listeners;

method addActionListener(ActionListener $al){
@!action_listeners.push($al);
}

method removeActionListener{
@!action_listeners.pop;
}
}

ActionListener 角色只是有一个 actionPerformed 方法。 ActionEvent 类可能不是必需的,目前它只是一个空类。
role ActionListener
{
method actionPerformed(ActionEvent $e) { ... }
}

从脚本运行:
my Subscriber $s = Subscriber.new;
my Timer $t = Timer.new(interval => 1);

$t.start;
$t.addActionListener($s);
$t.addActionListener(Subscriber.new);

.... #doing stuff that lasts for a while
$t.stop;

订阅者类实现 ActionListener 角色(有一个名为 actionPerformed 的方法)。

虽然这工作正常:订阅者的 actionPerformed 方法被调用,直到我调用计时器的停止方法。虽然没有适当的方法来删除给定的订阅者。另外我想知道是否有更好的方法来保持/打破 promise ,从外部给定代码循环不定式。

我基本上想知道我是否会错过 Perl6 的内置功能?我在重新发明轮子吗?

最佳答案

要进一步回答重新发明轮子的问题:您应该看看 Supply . SupplyObservable 的 Perl 6 术语, 和 TapSubscription 的 Perl 6 术语.

为了得到一个定期调用订阅者的 observable,你可以使用 the interval class method of the Supply type .您可以调用 .tap关于 .interval 的结果调用以注册要运行的代码块 Supply emit s 值和 .tap 的结果电话是Tap您可以关闭订阅的对象。

These talk slides by Jonathan Worthington如果您想了解更多有关耗材的信息,可能会很有趣。

关于concurrency - Perl6 制作一个可观察的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51079125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com