如何在 Perl 中列出给定对象或包的可用方法?
问问题
20198 次
5 回答
40
在 Perl 中有(相当)很多方法可以做到这一点,因为在 Perl 中有很多方法可以做到这一点。正如有人评论的那样,自动加载的方法总是有点棘手。但是,与其采用自己的方法,我建议您查看 CPAN 上的Class::Inspector。这将使您可以执行以下操作:
my $methods = Class::Inspector->methods( 'Foo::Class', 'full', 'public' );
于 2009-05-26T13:08:54.920 回答
23
如果你有一个名为 的包Foo
,应该这样做:
no strict 'refs';
for(keys %Foo::) { # All the symbols in Foo's symbol table
print "$_\n" if exists &{"Foo::$_"}; # check if symbol is method
}
use strict 'refs';
或者,要获取 package 中所有方法的列表Foo
:
no strict 'refs';
my @methods = grep { defined &{"Foo::$_"} } keys %Foo::;
use strict 'refs';
于 2009-05-26T12:42:41.557 回答
13
如果你有一个使用Moose的包,它相当简单:
print PackageNameHere->meta->dump;
对于更完整的数据:
use Data::Dumper;
print Dumper( PackageNameHere->meta );
会让你开始。对于其他一切,出现->meta
在Class::MOP::Class中的方法
你可以对没有它的包做一些 AdHoc 假装驼鹿的好处:
use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize( PackageNameHere );
然后像使用 Moose 一样继续使用 Class::MOP 方法。
对于初学者:
$meta->get_method_map();
使用驼鹿;#,真棒。
于 2009-05-26T14:51:11.280 回答
3
一般来说,你不能用像 Perl 这样的动态语言来做到这一点。该包可能定义了一些您可以找到的方法,但它也可以即时组成在您使用它们之前没有定义的方法。此外,即使调用一个方法(有效)也可能不会定义它。这就是使动态语言变得更好的东西。:)
你想解决什么任务?
于 2009-05-26T15:24:44.117 回答
1
如何获取结构和继承历史的一个很好的答案
可以使用以下方法找到对象类当前继承的类:
use mro qw( );
use Scalar::Util qw( blessed );
say join ", ", @{ mro::get_linear_isa(blessed($o)) };
于 2019-12-29T14:50:01.853 回答