В 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:Method) и вызвать его как
package main;
my $foo = Foo->new();
my $ref = \&Foo::bar;
$foo->$ref();
Но иногда (хорошо, часто) вы не знаете явный тип. Допустим, есть Foo
, Bar
, Baz
, и у каждого из них есть собственный метод blat
. Вы хотите получить ссылку на соответствующий метод, основанный на объекте, а не на пакете. Как бы вы это сделали?