代码之家  ›  专栏  ›  技术社区  ›  jantimon

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

  •  34
  • jantimon  · 技术社区  · 14 年前

    我想使用一个对象的方法。 喜欢 $myObject->helloWorld() .

    但是,有两个方法,所以我循环遍历一个方法名数组,然后这样调用该方法:

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

    这很好,但有些对象没有所有的方法。

    我怎么知道 $myObject 有一个方法调用 helloWorld 是不是?

    4 回复  |  直到 6 年前
        1
  •  45
  •   Eric Strom    14 年前

    您可以使用 UNIVERSAL::can 方法来确定它支持哪些方法:

    if ($myObject->can($methodName)) {
        $myObject->$methodName;
    }
    
        2
  •  13
  •   DVK    14 年前

    如埃里克所说,你可以 通常 使用 UNIVERSAL::can

    它既可以用于对象,也可以用于示例中的对象。( $obj->can($methodName) )或者静态地,在类上:( CLASS->can($methodName) )

    请注意,有可能与使用 通用::can 在具有自动加载方法的对象/类上-请参见 perldoc 有关详细信息。所以在使用之前 can() 在对象/类上,请注意验证相关类是否不使用autoload或重写 小精灵 补偿,或使用正向声明补偿 can() 's perldoc -Brian D Foy的帽子贴士)

    另外,请小心不要打电话 () 在实际对象上,或用eval将其封装。如果对非对象(例如,UNdef、scalar等)调用,它将死亡。

        3
  •  9
  •   brian d foy    6 年前

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

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

    这个 可以 有一个附加功能,它返回对该方法的代码引用。有时候这很方便。

        4
  •  1
  •   memowe    12 年前

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

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