gpt4 book ai didi

perl - 如何确定一个对象是否在 Perl 中实现了一个方法?

转载 作者:行者123 更新时间:2023-12-04 13:21:45 32 4
gpt4 key购买 nike

我有一个实现两个(非正式)接口(interface)的多态对象数组。我希望能够通过以下方面的反射来区分它们:

if (hasattr(obj, 'some_method')) {
# `some_method` is only implemented by one interface.
# Now I can use the appropriate dispatch semantics.
} else {
# This must be the other interface.
# Use the alternative dispatch semantics.
}

也许这样的东西有效?:
if (*ref(obj)::'some_method') {
# ...

我很难说出语法何时会尝试调用子例程以及何时返回子例程引用。我对包符号表 ATM 不太熟悉,我只是想破解一些东西。 :-)

提前致谢!

最佳答案

use Scalar::Util qw(blessed);
if( blessed($obj) and $obj->can('some_method') ){

}

这里的“can”是所有类都继承自 UNIVERSAL的方法.类可以重写此方法,但这不是一个好主意。

此外,“can”返回对该函数的引用,因此您可以执行以下操作:
$foo->can('some_method')->( $foo , @args );

或者
my $sub = $foo->can('some_method'); 
$foo->$sub( @args );
  • Scalar::Util
  • Perl Objects on perldoc.perl.org

  • 编辑 更新链语法,感谢 Brian Phillips

    关于perl - 如何确定一个对象是否在 Perl 中实现了一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/460676/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com