Vad*_*man 7 syntax perl6 symbolic-references
我正在为我的工作重写从Perl5到Perl6的框架.在某些地方,我需要通过执行sub他们可能提供的公众来从其他模块/类中收集信息; 或者他们可能没有.所以,有必要找出它是否sub存在.当模块直接引用(Foo::<&my-sub>)或字符串中的符号名称(&::("Foo"):: my-sub)时,这不是什么大问题.但为了简单起见,我想允许按原样传递模块名称(假设collector是收集信息的方法):
self.collector( Foo );
Run Code Online (Sandbox Code Playgroud)
凡Foo可能是以下几点:
module Foo {
use Bar;
use Baz;
our sub my-sub { Bar, 'Baz' }
}
Run Code Online (Sandbox Code Playgroud)
这就是我遗漏了Perl6语法中的重要内容,因为以下内容:
method collector ( $mod ) {
my $mod-name = $mod.WHO;
my @mods;
with &::($mod-name)::my-sub {
@mods.push: &$_();
}
}
Run Code Online (Sandbox Code Playgroud)
目前是我可以执行任务的唯一方法.
虽然我没有尝试过类型捕获.我想应该按预期工作.所以,问题更多的是扩展我的语法知识.
最终的解决方案来自于Vadim在他们的问题评论中的交流。这可以说是疯狂的。他们认为这很美丽。我该跟谁争论呢?.oO(哈哈,呵呵,嘻嘻……)
my $pkg-arg = (Int, 'Int').pick;
my \pkg-sym = $pkg-arg && ::($pkg-arg);
my \sub-ref = &pkg-sym::($subname);
Run Code Online (Sandbox Code Playgroud)
有两种明显有用的方法来引用包:
它的象征性名称。Int是 Int 类的符号名称。
它的字符串名称。'Int'是 Int 类的字符串名称。
瓦迪姆(Vadim)显然希望找到一个能够兼顾两者的解决方案。
在此答案的解决方案中,我通过随机选择一种参数并将其分配给来模拟两种类型的参数$pkg-arg:
my $pkg-arg = (Int, 'Int').pick;
Run Code Online (Sandbox Code Playgroud)
现在我们需要正常化。如果我们有了一个象征性的名字,我们就可以开始了。但如果它是字符串名称,我们需要将其转换为符号名称。
瓦迪姆在他们的问题的评论中展示了几种方法来做到这一点。该解决方案使用第三个选项:
my \pkg-sym = $pkg-arg && ::($pkg-arg);
Run Code Online (Sandbox Code Playgroud)
如果$pkg-arg是一个符号名称,那么它将是False。对于FalseLHS,&&短路并返回其 LHS。如果$pkg-arg是字符串名称,则将&&返回其 RHS,这是::($pkg-arg)用作字符串名称的符号查找$pkg-arg。
结果是pkg-sym最终包含一个包符号名称(Failure如果查找未能找到匹配的符号名称,则为 )。
剩下最后一行。它会查找$subname包中名为的子项pkg-sym:
my \sub-ref = &pkg-sym::($subname);
Run Code Online (Sandbox Code Playgroud)
需要&确保 RHS 被视为参考而不是尝试调用例程。并且pkg-sym必须是无符号标识符,否则代码将无法工作。
这三行代码的末尾sub-ref包含一个Failure或对所需子项的引用。