我想使用一个对象的方法.喜欢$myObject->helloWorld().
但是有几种方法,所以我遍历一个方法名称数组,并调用这样的方法:
my $methodName ="helloWorld";
$myObject->$methodNames;
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但有些对象没有所有方法.
我怎么知道是否$myObject有一个方法被调用helloWorld?
Eri*_*rom 48
您可以使用UNIVERSAL::can所有对象的方法来确定它支持的方法:
if ($myObject->can($methodName)) {
$myObject->$methodName;
}
Run Code Online (Sandbox Code Playgroud)
DVK*_*DVK 13
正如Eric所说,你通常可以使用UNIVERSAL::can
它既可以在示例($obj->can($methodName))中使用,也可以静态地在类上使用:( CLASS->can($methodName))
请注意,使用UNIVERSAL::can具有AUTOLOAD-ed方法的对象/类可能存在错误否定- 请参阅perldoc以获取详细信息.因此,在使用can()对象/类之前,请小心验证相关类是否使用AUTOLOAD,或覆盖can()以补偿,或使用前向声明进行补偿,如can()'perldoc - hat tip to brian d foy中所述)
另外,请小心只调用can()实际对象,或将其封装在eval中.如果调用非对象(例如undef,标量等),它将会死亡
规范的使用方法can是在一个eval块内,以防你标量变量中的东西实际上不是一个对象.您不必担心这一点,因为您仍然会得到正确的答案(非对象或类无法响应该方法):
if( my $ref = eval { $obj->can( $method ) } ) {
$obj->$ref( @args );
}
Run Code Online (Sandbox Code Playgroud)
它can具有添加的功能,它返回方法的代码引用.有时这可以很方便.