syntax - 内省模块/类/等的替代语法
问题描述
出于工作目的,我正在将框架从 Perl5 重写为 Perl6。在某些地方,我需要通过执行sub
它们可能提供的公共来从其他模块/类收集信息;或者他们可能不会。因此,有必要找出是否sub
存在。当一个模块被直接引用Foo::<&my-sub>
(但为了简单起见,我想允许按原样传递模块名称(假设collector
是收集信息的方法):
self.collector( Foo );
Foo
可能在哪里:
module Foo {
use Bar;
use Baz;
our sub my-sub { Bar, 'Baz' }
}
这就是我在 Perl6 语法中遗漏了一些重要的地方,因为以下内容:
method collector ( $mod ) {
my $mod-name = $mod.WHO;
my @mods;
with &::($mod-name)::my-sub {
@mods.push: &$_();
}
}
目前是我可以执行任务的唯一方法。
不过,我还没有尝试过类型捕获。我猜应该按预期工作。所以,问题更多是关于扩展我对语法的了解。
解决方案
在对他们问题的评论中与 Vadim 交流的最终解决方案。可以说是疯了。他们认为它很漂亮。我该和谁争论?.oO(哈哈,呵呵,嘻嘻……)
my $pkg-arg = (Int, 'Int').pick;
my \pkg-sym = $pkg-arg && ::($pkg-arg);
my \sub-ref = &pkg-sym::($subname);
有两种明显有用的方法来引用包:
它的象征性名称。
Int
是 Int 类的符号名称。它的字符串名称。
'Int'
是 Int 类的字符串名称。
Vadim 非常合理地希望为两者提供解决方案。
在这个答案的解决方案中,我通过随机选择一种并将其分配给来模拟两种类型的参数$pkg-arg
:
my $pkg-arg = (Int, 'Int').pick;
现在我们需要标准化。如果我们有一个象征性的名字,我们就可以开始了。但如果它是一个字符串名称,我们需要将其转换为符号名称。
Vadim 在对他们问题的评论中展示了几种方法来做到这一点。此解决方案使用第三种选择:
my \pkg-sym = $pkg-arg && ::($pkg-arg);
如果$pkg-arg
是一个符号名称,它将是False
. 对于False
LHS,&&
短路并返回其 LHS。如果$pkg-arg
是字符串名称,&&
则将改为返回其 RHS,这是一个用作字符串名称::($pkg-arg)
的符号查找。$pkg-arg
结果是pkg-sym
最终包含一个包符号名称(或者Failure
如果查找未能找到匹配的符号名称)。
剩下最后一行。这会寻找一个$subname
在包中命名的子pkg-sym
:
my \sub-ref = &pkg-sym::($subname);
需要确保将&
RHS 视为参考而不是尝试调用例程。并且pkg-sym
必须是无符号标识符,否则代码将不起作用。
在这三行代码的末尾sub-ref
包含一个Failure
或对所需子的引用。
推荐阅读
- authentication - 对于具有 Oauth 2.0 隐式流程的 Web 应用程序,是否有避免不时询问用户登录的解决方案?
- vue.js - ApexChart 条形图中的条形图覆盖了数据标签
- python - 如何使用 Python 3.8 安装 pip?
- r - 如何在保留其他列类型的同时拆分“data.frame”类型列?
- c# - 通过按顺序选择单个文件打开多个文件 - 从多个文件生成文件名
- python - Pandas 在组之间删除重复项
- javascript - chrome 扩展:持久性后台脚本何时停止运行?
- mysql - 在 MYSQL 的一个查询中更新多行的问题
- python - “python setup.py install”的退出代码
- javascript - JavaScript 将值从 Servlet 返回到一个 Jsp 但不是第二个