我想创建一个Perl 6模块,它将一个LEAVE移相器"导出" 到use放置语句的作用域.我还没有办法做到这一点.
我认为这需要在EXPORT子内部完成,但如何?EXPORTsub 的默认功能是返回一个Map名称=>要导出的事物的对象映射.据我所知,没有办法反省外部范围.或者我错过了什么?
感谢Zoffix ++指出了一种非常黑客的做法.
sub EXPORT() {
$*W.add_phaser: $*LANG, 'LEAVE', { code you want to run }
{} # need to show that we're not exporting anything
}
Run Code Online (Sandbox Code Playgroud)
这种黑客取决于各种Rakudo内部,因此不建议"在野外"使用.并且很有可能在不久的将来为此功能实施更好,更可支持的方式.
除了从创建对象的直接范围(aka LEAVEphaser)以外,支持一种及时破坏的模块需要此hack .这通常在Perl 5中通过使用引用计数和调用(DESTROY如果对象的引用计数变为0)来处理.
此模块现在可以在Perl 6生态系统中找到:FINALIZER.此模块允许模块开发人员标记创建的对象以进行最终化:默认情况下,在程序退出时.或者从客户端程序指示的范围.