如何检查对象是否具有特定方法?

时间:2010-04-15 16:46:19

标签: perl

我想使用对象的方法。 与$myObject->helloWorld()一样。

然而,有几种方法,所以我遍历一个方法名称数组并调用这样的方法:

my $methodName ="helloWorld";
$myObject->$methodNames;

这非常好用,但有些对象没有所有方法。

如何判断$myObject是否有一个名为helloWorld的方法?

4 个答案:

答案 0 :(得分:47)

您可以使用所有对象的UNIVERSAL::can方法来确定它支持的方法:

if ($myObject->can($methodName)) {
    $myObject->$methodName;
}

答案 1 :(得分:13)

正如Eric所说,你通常使用UNIVERSAL::can

它可以在一个对象上使用,如示例($obj->can($methodName)),也可以静态地用在类上:(CLASS->can($methodName)

请注意,对于使用AUTOLOAD方法的对象/类使用UNIVERSAL::can可能存在误报 - 有关详细信息,请参阅perldoc。因此,在对象/类上使用can()之前,请注意验证相关类是否使用AUTOLOAD,或覆盖can()来补偿,或使用前向声明进行补偿,如{ {3}} - 帽子提示brian d foy)

另外,请注意只在实际对象上调用can(),或将其封装在eval中。如果调用非对象(例如undef,标量等......)

,它将会死亡

答案 2 :(得分:9)

使用can的规范方法是在eval块内,以防您标量变量中的内容实际上不是对象。您不必担心,因为您仍然会得到正确的答案(非对象或类无法响应该方法):

 if( my $ref = eval { $obj->can( $method ) } ) {
      $obj->$ref( @args );
      }

can具有添加的功能,即它返回方法的代码引用。有时这可以很方便。

答案 3 :(得分:1)

我在检查数据库连接时使用了这个方法,并将其传递给函数,例如

my $method = "ping";
if(defined ($local_dbh) && eval{ $local_dbh->can($method) } ) {
    if ($local_dbh->ping) {
        return $local_dbh;
    }
}
else {
    ## do connection
    ...
}