Пока я помню, всякий раз, когда я использую модуль, я включаю строку use
в начале моего кода.Когда следует использовать `use`?
Недавно я писал два модуля объекта Moose, которые используют друг друга. Посмотрите на это по-простеньком примере:
Один модуль:
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();
Теперь обратите внимание на два модуля используют друг друга. M1
создает экземпляр M2
и использует его для генерации very_cool_name
, а M2
имеет экземпляр M1
в качестве атрибута.
Теперь, если я раскомментировал use M2;
в M1
, мое затмение сошло с ума. Я думаю, это потому, что это цикл, созданный этим «круговым использованием».
Я прокомментировал это use
, и все, кажется, работает нормально (я думаю ...), но меня очень беспокоит (я использую объект без use
-в его классе! Это «законный»? ..) , Это также заставило меня задуматься:
Когда мне действительно нужно использовать
use
? Я думаю, что меня учили всегда использовать его, и, конечно, когда я использую объект.Есть ли что-то принципиально неправильное, когда два модуля используют друг друга (в том смысле, что каждый использует объект другого модуля, я знаю там случаи, когда это логически невозможно, но иногда - как в этом случае - I думаю, что это имеет смысл).
Скажем, я извлекаю сохраненный объект M1 в '$ m1'. Насколько я понимаю из вашего ответа, мне не нужно «использовать M1». Итак, будет ли Perl просто смотреть в моем '@ INC' для' M1.pm', чтобы увидеть, что он должен делать с этим загруженным объектом? –
* 'use' класс, когда вы собираетесь напрямую обращаться к методам - например,' new' * - обратите внимание, что 'M1' вызывает' M2-> new' без 'use M2'. Кажется, что это работает, так что такое «польза» от добавления «использования» здесь? –
@David: повторите свой второй вопрос, если 'M2' уже загружен, то' use M2' ничего не делает (предполагая, что M2 ничего не экспортирует, чего не следует, если это класс OO). Но * вы должны иметь 'M2' уже загружен *, прежде чем пытаться« M2-> новый ». – Ether