raku - 如何将 LEAVE 移相器导出到 use 语句的外部范围
问题描述
我想创建一个 Perl 6 模块,它将一个移相器“导出”到放置语句LEAVE
的范围内。use
我还没有找到一种方法来做到这一点。
我认为这需要在一个EXPORT
潜艇内完成,但是如何?sub的默认功能EXPORT
是仅返回Map
要导出的事物的名称 => 对象映射。据我所知,没有办法反省外部范围是什么。还是我错过了什么?
解决方案
感谢 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。该模块允许模块开发人员标记创建的对象以进行最终确定:默认情况下在程序退出时。或者来自客户端程序指示的范围。
推荐阅读
- java - 如何使用 travis ci 配置 SSH 连接?
- r - Alteryx 中的 R 工具不呈现图形
- c# - 在不使用文件系统的情况下,在 C# 中序列化和反序列化对象
- react-native - 下载整个视频文件后,带有远程 url 播放的 react-native-video
- perl - 在连接 (.) 或字符串中使用未初始化的值 $Row[3]
- javascript - 为什么 Input onchange javascript 在我的代码中不起作用
- mysql - nodejs/mysql - 是否有可能确保所有行都只有一个 true
- python-3.x - Scikit Learn GridSearchCV 中的 n_jobs 是否有限制,它必须小于 cv 折叠的数量?
- hashmap - 元素如何存储在 Ada 的 Hashmap 中?
- gps - 识别 GPS 数据集中的负簇