如何在“信号”块中调用方法?
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
}
是否可以在信号块中调用用户定义的方法?
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
}