如何将函数传递给构造函数

时间:2012-09-25 12:39:29

标签: perl

如何将函数传递给构造函数,以便类可以在内部使用它?

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;

3 个答案:

答案 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(@_) });