如何判断对象是否具有特定的重载方法?
我想检查一个对象在 perl 中是否有特定的重载方法——例如,它是否有一个子解引用重载,它会像这样定义:
use overload
'&{}' => &_some_sub;
sub some_sub {...}
如果我转储创建相关对象的包的符号表,我会看到以下内容:
[
"new",
"import",
"((",
"(&{}",
"ISA",
"__ANON__",
"BEGIN",
]
(&{}在符号表中找到是否总是意味着存在子 deref 方法?并且它也适用于其他重载(我看看(""我是否重载了字符串化)。
回答
overload引擎盖下如何工作的细节没有很好地记录,本IMPLEMENTATION节的第一行是接下来的内容可能会更改 RSN。所以你不能依赖检查符号表。
但是,该模块确实提供了一种方法来查看运算符是否为对象重载:
重载::方法(对象,操作)
返回
undef或引用实现 的方法op。
所以你可以使用
if (overload::Method($someobj, '&{}')) {
# Overloaded sub deref
}