如何判断一个对象是否有特定的重载方法?

How can I tell if an object has a specific overloaded method?

我想检查一个对象在 perl 中是否有特定的重载方法——例如,如果它有一个子解引用重载,它会像这样定义:

use overload
    '&{}' => \&_some_sub;

sub some_sub {...}

如果我转储创建相关对象的包的符号 table,我会看到以下内容:

[
  "new",
  "import",
  "((",
  "(&{}",
  "ISA",
  "__ANON__",
  "BEGIN",
]

在符号 table 中发现 (&{} 是否总是 意味着存在子解引用方法?它是否也适用于其他重载(如果我重载字符串化,我会看到 ("")。

关于 overload 如何在幕后工作的细节没有很好的记录,IMPLEMENTATION 部分的第一行是 接下来的内容可能会更改 RSN . 所以你不能依赖于检查符号 table.

但是,该模块会provide a way查看某个对象是否重载了运算符:

overload::Method(obj,op)

Returns undef or a reference to the method that implements op.

所以你可以使用

if (overload::Method($someobj, '&{}')) {
    # Overloaded sub deref
}