【问题标题】:How to call a method within a `signal` block?如何在“信号”块中调用方法?
【发布时间】:2020-04-19 02:54:10
【问题描述】:

是否可以在信号块中调用用户定义的方法?

method my-method ( ... ) {
    signal(SIGTERM,SIGINT,SIGQUIT,SIGHUP).tap( -> $sig {
        say "Received signal: $sig";
        self!restore-term();
        exit;
    } );
    ...
    ...
}

【问题讨论】:

    标签: signals raku


    【解决方案1】:

    是的,但有一些警告。

    signal 提供了Supply 的事件,您可以使用tap(如果您愿意的话),但可能应该在react whenever 结构中使用。

    在您的示例中,tap 采用 Block (lambda)。每次调用该方法时,它都会设置另一个Supply(这可能不是您想要的)。

    只要有事件到达,就会调用这个块。这意味着它是完全异步的,除了创建块的词法上下文之外没有上下文。

    因此,每当信号到达Supply 时,它就会在调用该方法的那一刻运行带有self 的块。哪个可能不是您所期望的?

    所以我觉得你问错了问题。显然,您有一个对象(希望是哨兵),您希望在有人表示他们想离开程序时调用restore-term 方法。因此,您可能最好将程序重组为:

    my $sentinel = class.new(...);
    react {
        whenever signal(SIGTERM,SIGINT,SIGQUIT,SIGHUP) -> $sig {
            say "Received signal: $sig";
            $sentinel.restore-term();
            exit;
        }
        # .... other stuff
    }
    

    【讨论】:

    • “显然你有一个对象(希望是一个哨兵)”:这是否意味着我不应该为 restore-term 方法使用主对象,而是为 restore-term 方法创建一个单独的对象或者是哨兵对象有什么特别的吗?
    • "sentinel" 在这种情况下,它是一个等待调用方法的对象。是的,您可以在 react 中拥有任意数量的 whenever 块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多