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

sid*_*com 7 signals raku

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

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

Eli*_*sen 8

是的,但有一些警告。

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
}
Run Code Online (Sandbox Code Playgroud)