如何测试Perl 6类中是否已定义指定方法?
检查Perl 6类中是否存在指定方法
作为经常写Perl 6的开发者,我经常需要验证某个类是否定义了特定方法——这在排查方法重命名、架构调整引发的问题时特别实用。
我知道可以用.^lookup来做这件事,但一直有点担心它的返回顺序会不会不符合预期(这里先暂时忽略方法签名的问题)。经过摸索,我自己搞了个实现方案,在简单场景下用着挺顺手,目前还没碰到异常情况:
sub has-defined-method(Mu \target-type, Str $method-name --> Bool) { # 遍历目标类型的方法列表,精确匹配方法名 so target-type.^methods(:all).grep( *.name eq $method-name ) } # 测试用例 class SampleClass { method process-data { } } say has-defined-method(SampleClass, 'process-data'); # 输出 True say has-defined-method(SampleClass, 'invalid-method'); # 输出 False
这个方案的核心思路很直接:
- 调用
.^methods(:all)获取目标类型及其继承链中的所有方法(如果只需要检查当前类自身定义的方法,去掉:all参数即可) - 用
grep筛选出名称完全匹配的方法 - 最后用
so把匹配结果转换成布尔值,直接返回“存在/不存在”的判断
相比.^lookup,这种方式不会因为继承链的优先级问题返回意外的方法实例,对于只需要确认方法是否存在的简单场景来说,是个相当稳妥的选择。如果之后需要考虑方法签名的匹配,还可以在grep里加上对签名的校验逻辑,扩展起来也很方便。
内容的提问来源于stack exchange,提问作者brian d foy
相关产品推荐
相关产品推荐

