首页 > 解决方案 > 如何将 LEAVE 移相器导出到 use 语句的外部范围

问题描述

我想创建一个 Perl 6 模块,它将一个移相器“导出”到放置语句LEAVE的范围内。use我还没有找到一种方法来做到这一点。

我认为这需要在一个EXPORT潜艇内完成,但是如何?sub的默认功能EXPORT是仅返回Map要导出的事物的名称 => 对象映射。据我所知,没有办法反省外部范围是什么。还是我错过了什么?

标签: raku

解决方案


感谢 Zoffix++ 指出了一种非常老套的做法。

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

此 hack 取决于各种 Rakudo 内部结构,因此不建议“在野外”使用。而且很可能在不久的将来会为这个功能实现更好、更受支持的方式。

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

这个模块现在可以在 Perl 6 生态系统中找到:FINALIZER。该模块允许模块开发人员标记创建的对象以进行最终确定:默认情况下在程序退出时。或者来自客户端程序指示的范围。


推荐阅读