3

クラスが内部的に使用できるように、関数をコンストラクターに渡す方法は?

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;
4

3 に答える 3

3

もうすぐです。

$loger->logは関数の呼び出しですが、を使用して関数を参照できます\&Loger::log

\&{ref($loger)."::log"}同様に機能する可能性があります。

@simbabquesポイントを組み込むと、関数を渡す前に、つまり最初の引数を事前に提供する前に、関数をカレーする必要があります。これを行うには、コンストラクターを次のように呼び出します。

sub {$loger->log(@_)}

また

sub {unshift @_, $loger; goto \&Loger::log} # more efficient

引数として。

于 2012-09-25T12:44:04.877 に答える
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
}
于 2012-09-25T12:44:23.570 に答える
0

参照演算子は\、名前付きシンボルに対してのみ機能します。

あなたの行:

my $class = Class->new(\&{ $loger->log });

実際には無名サブルーチンを渡そうとしています。パラメータを $loger->log() に渡す方法もありません。

次のように変更できます。

my $class = Class->new(sub { $loger->log(@_) });

于 2012-09-25T14:16:32.717 に答える