[英]How do you dynamically call a method of an object?
在 Perl 中,我知道您可以使用eval
和*{$func_name}
来动态调用函数,但是如何使用对象的方法来执行此操作?
例如
EZBakeOven
sub make_Cake { ... }
sub make_Donut { ... }
sub make_CupCake { ... }
sub make_Soup { ... }
sub make{
my($self,$item) = @_;
if( defined $self->make_$item ){ #call this func if it exists
$self->make_$item( temp => 300, with_eggs => true );
}
}
所以如果我说类似的话
$self->make('Cake');
#or maybe I have to use the full method name
$self->make('make_Cake');
它会打电话
$self->make_Cake();
您应该能够执行以下操作:
sub make {
my ($self, $item) = @_;
my $method = "make_$item";
$self->$method(whatever);
}
编辑:您可能还想使用can()
来确保您正在调用一个可以调用的方法:
sub make {
my ($self, $item) = @_;
my $method = "make_$item";
if ($self->can($method)) {
$self->$method(whatever);
} else {
die "No such method $method";
}
}
编辑 2:实际上,现在我考虑了一下,我不确定您是否真的可以做到。 我之前写过的代码做了类似的事情,但它不使用对象,它使用一个类(所以你在一个类中调用一个特定的函数)。 它可能也适用于对象,但我不能保证。
正如@CanSpice 建议的那样,使用can
检查类和对象中的方法是否存在。 如果存在,则can
返回对该方法的引用,否则返回 undef。 您可以使用返回的引用直接调用该方法。
以下示例调用包/类上下文中的方法。 __PACKAGE__
返回当前包/类名称。
if ( my $ref = __PACKAGE__->can("$method") ) {
&$ref(...);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.