只要我记得,每当我使用模块时,我都会 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
?我认为我被教导要始终使用它,当然当我使用一个对象时也是如此。当两个模块相互使用时,有什么根本上的错误吗(从某种意义上说,每个模块都使用另一个模块的对象;我知道在某些情况下这在逻辑上是不可能的,但有时——比如在这种情况下——我认为这确实是有道理的)。