如何将函数传递给构造函数,以便类可以在内部使用它?
test.pl
use Class;
use Loger;
my $loger = Loger->new();
$loger->log('I have logger now, I can log messages!');
my $class = Class->new(\&{ $loger->log }); # here we pass the function (the method of other class) to contructor of a new Class
$class->do_something(); # class uses loger->log internally to report errors
Class.pm 包类;
sub new {
my $self = {};
$self->{log} = shift; # we got logger->log function, save it for future use
return bless $self;
}
sub do_something {
my $self = shift;
open_file or $self->{log}->('Cant open file'); # we can use gotten logger in class
}
1;
答案 0 :(得分:3)
你快到了。
虽然$loger->log
是一个函数调用,但您可以使用\&Loger::log
来引用该函数。
\&{ref($loger)."::log"}
也可能有用。
合并@simbabques点,你应该在传递它之前 curry 你的函数,即预先提供第一个参数。您可以通过使用
调用构造函数来完成此操作sub {$loger->log(@_)}
或
sub {unshift @_, $loger; goto \&Loger::log} # more efficient
作为论据。
答案 1 :(得分:3)
您正在尝试传递方法,而不是函数(或子)。单独调用它将无法正常工作。如果你想要一个对象的方法,传递对象并在对象上调用方法。
my $loger = Loger->new();
$loger->log('I have logger now, I can log messages!');
my $class = Class->new(logger => $loger); # pass the Loger object
在Class.pm
:
package Class;
sub new
{
my ($class, %args) = @_;
my $self = {};
$self->{log} = $args{'logger'}; # store it inside your Class object
return bless $self;
}
sub do_something
{
my $self = shift;
open_file or $self->{log}->log->('Cant open file'); # call its log-method
}
答案 2 :(得分:0)
\
引用运算符仅适用于命名符号。
你的专栏:
my $class = Class->new(\&{ $loger->log });
实际上是尝试传递匿名子例程。它也缺少一种将参数传递给$ loger-> log()的方法。
您可以将其更改为:
my $class = Class->new(sub { $loger->log(@_) });