私が覚えている限り、モジュールを使用するときはいつでも use
、コードの先頭に行を含めます。
最近、相互に使用する 2 つの Moose オブジェクト モジュールを作成していました。この単純すぎる例を見てください。
1 つのモジュール:
package M1 0.001;
use Moose;
use 5.010;
use namespace::autoclean;
# use M2; ### SEE QUESTION BELOW
has 'name' => (
is => 'ro',
isa => 'Str',
required => 1,
);
has 'very_cool_name' => (
is => 'ro',
lazy => 1,
builder => '_build_very_cool_name',
);
sub _build_very_cool_name {
my ($self) = @_;
my $m2 = M2->new( m1 => $self );
return 'very ' . $m2->cool_name();
}
__PACKAGE__->meta->make_immutable;
1;
別のモジュール: パッケージ M2 0.001;
use Moose;
use 5.010;
use Data::Dumper; # TODO DEBUG REMOVE
use namespace::autoclean;
use M1;
has 'm1' => (
is => 'ro',
isa => 'M1',
required => 1,
);
sub cool_name {
my ($self) = @_;
return 'cool ' . $self->m1->name();
}
__PACKAGE__->meta->make_immutable;
1;
そして、それらを使用する短い例:
use strict;
use warnings;
use 5.010;
use M1;
use M2;
my $m1 = M1->new(name => 'dave');
say $m1->very_cool_name();
ここで、2 つのモジュールが相互に使用されていることに注意してください。M1
のインスタンスを作成し、M2
それを使用して を生成しますがvery_cool_name
、M2
は のインスタンスをM1
属性として持ちます。
さて、日食でコメントを外すuse M2;
とM1
、狂ってしまいます。それは、この「循環利用」が生み出すループだからではないでしょうか。
私はこれにコメントしuse
、すべてが正常に動作しているように見えます (私は思う...) が、私は本当に不安になります (私はuse
そのクラスを -ing せずにオブジェクトを使用しています!それは「合法」ですか?..)。これも私を驚かせました:
本当にいつ使用する必要があります
use
か? モノを使うときは必ず使うように教わったと思います。2 つのモジュールが相互に使用する場合、何か根本的に問題がありますか (それぞれが他のモジュールのオブジェクトを使用するという意味で)。これが論理的に不可能な場合があることは知っていますが、この場合のように、理にかなっている場合もあります。 )。