如何在“信号”块中调用方法?

How to call a method within a `signal` block?

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

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

是的,但有一些注意事项。

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
}