如何将LEAVE相位器导出到use语句的外部范围

时间:2018-06-13 19:08:17

标签: perl6

我想创建一个Perl 6模块,它将导出"导出"一个geography移相器到model.clone()语句所在的范围。我还没有办法做到这一点。

我认为这需要在LEAVE子内完成,但如何? use sub的默认功能是返回名称=>的EXPORT。要导出的对象映射。据我所知,没有办法反省外部范围。或者我错过了什么?

2 个答案:

答案 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"; }

也许这对你也有用......