我想创建一个Perl 6模块,它将导出"导出"一个geography
移相器到model.clone()
语句所在的范围。我还没有办法做到这一点。
我认为这需要在LEAVE
子内完成,但如何? use
sub的默认功能是返回名称=>的EXPORT
。要导出的对象映射。据我所知,没有办法反省外部范围。或者我错过了什么?
答案 0 :(得分:7)
感谢Zoffix ++指出非常hacky方式这样做。
sub EXPORT() {
$*W.add_phaser: $*LANG, 'LEAVE', { code you want to run }
{} # need to show that we're not exporting anything
}
这种黑客取决于各种Rakudo内部,因此不建议在野外使用""。并且很有可能在不久的将来为此功能实施更好,更可支持的方式。
除了从创建对象的直接作用域(又称LEAVE
移相器)以外,支持一种及时破坏的模块需要此hack。这通常通过使用引用计数在Perl 5中处理,如果对象的引用计数变为0,则调用DESTROY
。
此模块现在可以在Perl 6生态系统中找到:FINALIZER。此模块允许模块开发人员标记创建的对象以进行最终化:默认情况下,在程序退出时。或者来自客户端程序指示的范围。
答案 1 :(得分:1)
不确定这是可能的,但其他人可能知道更多。但是你到底是怎么回事?我不久前有类似的愿望,我想做一些像RAII锁的东西。我通过包裹块而不是直接将LEAVE放入其中来解决它:
sub mtest($block) { LEAVE { say "hoo" }; $block() }
mtest { say "woo"; }
也许这对你也有用......