Perl 6中能否获取附加到特定multi sub候选的Pod声明块?
嘿,你提到的这个Perl 6的.WHY特性确实很实用,但multi sub多候选场景下的Pod获取问题确实是个容易踩的小坑,我来给你梳理下解决方案~
首先先确认你说的常规用法没问题:Perl 6允许我们通过.WHY方法直接获取附加在子程序、类、角色等元素上的Pod注释块,比如这段代码:
#|(Some enlightening words about myfunc.) sub myfunc (Int $i) { say "You provided an integer: $i"; }; #=(Some more words about myfunc.) say &myfunc.WHY;
运行后会输出:
Some enlightening words about myfunc.
Some more words about myfunc.
但正如你所说,当我们用multi sub定义多个候选子程序时,直接调用&multi-sub-name.WHY没法精准获取某个特定候选的Pod——因为&multi-sub-name指向的是所有候选的集合体,它的.WHY通常只会返回第一个候选的注释,没法直接定位到单个候选。
那怎么拿到特定候选的Pod呢?其实每个multi sub的候选都是独立的子程序对象,我们可以通过candidates方法获取所有候选的列表,然后要么遍历所有候选查看各自的.WHY,要么根据签名筛选出目标候选后再获取它的Pod:
举个实际的例子:
#|处理整数类型的候选,返回输入值的两倍 multi sub process(Int $num) { $num * 2 } #|处理字符串类型的候选,返回大写形式 multi sub process(Str $str) { $str.uc } # 遍历所有候选,输出每个候选的签名和对应的Pod for &process.candidates -> $candidate { say "候选签名: {$candidate.signature}"; say "对应的注释: {$candidate.WHY}\n"; } # 或者根据签名筛选出特定候选,比如只找处理整数的那个 my $int-candidate = &process.candidates.first(*.signature.params[0].type ~~ Int); say "处理整数的候选注释: ", $int-candidate.WHY;
运行这段代码就能精准获取每个multi sub候选对应的Pod注释了。核心就是先拿到单个候选的子程序引用,再调用它的.WHY方法,因为每个候选都单独持有自己的Pod元数据。
内容的提问来源于stack exchange,提问作者Enheh
相关产品推荐
相关产品推荐

