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

How do I export a LEAVE phaser to the outer scope of a use statement

我想创建一个 Perl 6 模块,它将 "export" 一个 LEAVE 移相器到放置 use 语句的范围。我还没有找到这样做的方法。

我假设这需要在 EXPORT sub 中完成,但是怎么做呢? EXPORT sub 的默认功能只是 return 一个 Map 名称 => 要导出的对象映射。据我所知,没有办法反省外部范围是什么。还是我遗漏了什么?

不确定这是否可能,但其他人可能了解更多。但你究竟想要什么?前段时间我也有类似的愿望,想做一个RAII锁之类的东西。我通过包装块而不是直接将 LEAVE 放入其中来解决它:

sub mtest($block) { LEAVE { say "hoo" }; $block() } mtest { say "woo"; }

也许这对你也适用...

感谢 Zoffix++ 指出了一个非常 hacky 的方法

sub EXPORT() {
    $*W.add_phaser: $*LANG, 'LEAVE', { code you want to run }
    {}  # need to show that we're not exporting anything
}

此 hack 依赖于各种 Rakudo 内部结构,因此不建议使用 "in the wild"。并且很可能在不久的将来会为此功能实施更好、更受支持的方式。

支持某种及时销毁的模块需要此 hack,而不是从创建对象的直接范围(又名 LEAVE 移相器)。这通常在 Perl 5 中通过使用引用计数并在对象的引用计数变为 0 时调用 DESTROY 来处理。

现在可以在 Perl 6 生态系统中找到此模块:FINALIZER。该模块允许模块开发人员将创建的对象标记为完成:默认情况下在程序退出时。或者从客户端程序指定的范围。