在Perl你怎么挑动态作为回调用了什么方法?
题
在Perl中,这是相当微不足道的指定一个回调或代码引用,如果它的包装是已知的:
package Foo;
sub foo { print "in foo" }
# and then
package main;
sub baz {
my $code = shift;
$code->();
}
baz( \&Foo::foo );
和该打印in foo
。
假设你有一个对象,永远那么微不足道,像这样的:
package Foo;
sub new { bless {}, shift }
sub bar { print "in bar" }
sub baz { print "in baz" }
可以查找的方法,使用上述方法(\&包装:方法),并调用它像
package main;
my $foo = Foo->new();
my $ref = \&Foo::bar;
$foo->$ref();
但有时(好吧,经常)你不知道明确的类型。比方说,有Foo
,Bar
,Baz
,他们都有自己的blat
方法。你想为参考,以适当的方法,基于这样的目的,而不是包装上。你会如何呢?
解决方案
my $ref = $obj->can('blat');
如果$裁判是民主基金,你的对象不能BLAT。如果$ REF没有未定义,这是一个有效的代码参考所讨论的功能,适合用于调用。“$ OBJ - > $ REF(@args)”
其他提示
让方法查找做的工作适合你:
$ cat try
#! /usr/bin/perl
use warnings;
use strict;
package Foo;
sub new { bless {} => shift }
sub blat { "Foo blat" }
package Bar;
sub new { bless {} => shift }
sub blat { "Bar blat" }
package Baz;
sub new { bless {} => shift }
sub blat { "Baz blat" }
package main;
my $method = "blat";
foreach my $obj (Foo->new, Bar->new, Baz->new) {
print $obj->$method, "\n";
}
$ ./try
Foo blat
Bar blat
Baz blat
如果你需要一个参考,请记住,Perl中没有代表,但你可以亲近:
my @objs = (Foo->new, Bar->new, Baz->new);
my $method = "blat";
my $obj = $objs[rand @objs];
my $ref = $obj->can($method);
if ($ref) {
print $ref->($obj), "\n";
}
else {
print "$obj: no can $method\n";
}
即使接近将是:
my $delegate = sub { $obj->$ref };
# or sub { $obj->$method }
print $delegate->(), "\n";
不隶属于 StackOverflow