我想使用对象的方法。
与$myObject->helloWorld()
一样。
然而,有几种方法,所以我遍历一个方法名称数组并调用这样的方法:
my $methodName ="helloWorld";
$myObject->$methodNames;
这非常好用,但有些对象没有所有方法。
如何判断$myObject
是否有一个名为helloWorld
的方法?
答案 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
...
}