【发布时间】:2010-10-28 23:13:21
【问题描述】:
如何在 Perl 中列出给定对象或包的可用方法?
【问题讨论】:
标签: perl introspection
如何在 Perl 中列出给定对象或包的可用方法?
【问题讨论】:
标签: perl introspection
来自How to get structure and inheritance history的好回答
可以使用以下方法找到对象的类当前继承的类:
use mro qw( );
use Scalar::Util qw( blessed );
say join ", ", @{ mro::get_linear_isa(blessed($o)) };
【讨论】:
如果你有一个名为 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';
或者,获取包Foo中所有方法的列表:
no strict 'refs';
my @methods = grep { defined &{"Foo::$_"} } keys %Foo::;
use strict 'refs';
【讨论】:
defined &{$_} 应该是defined &{"Foo::$_"} 否则检查将无法从不同的包中进行。
在 Perl 中有(相当)很多方法可以做到这一点,因为在 Perl 中有很多方法可以做到这一点。正如有人评论的那样,自动加载的方法总是有点棘手。但是,与其采用自己的方法,我建议您查看 CPAN 上的 Class::Inspector。这将使您可以执行以下操作:
my $methods = Class::Inspector->methods( 'Foo::Class', 'full', 'public' );
【讨论】:
@methods 应该是 $methods。
如果你有一个使用 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();
使用 Moose; #,它的真棒。
【讨论】:
一般来说,你不能用像 Perl 这样的动态语言来做到这一点。该包可能会定义一些您可以找到的方法,但它也可以即时组成在您使用它们之前没有定义的方法。此外,即使调用一个方法(有效)也可能不会定义它。这就是使动态语言变得更好的东西。 :)
你想解决什么任务?
【讨论】: