只要我记得,每当我使用模块时,我都会在代码的开头添加一行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
?我认为我被教导要始终使用它,当然,当我使用一个对象时。有什么根本性的错误,当两个模块相互利用(在这个意义上,每个使用其他模块的对象;我知道有一些情况下,这在逻辑上是不可能的,但有时 - 在这种情况下 - 我认为它确实有道理)。
假设我正在将存储的M1对象检索到'$ m1'中。据我的理解,我不需要'使用M1'。那么,perl只需在我的'@ INC'中查找'M1.pm'来查看它应该如何处理这个加载的对象呢? – 2010-10-22 15:27:31
*当你打算直接调用它的方法时使用''类''例如'new' * - 注意''M1'不用'使用M2'调用'M2-> new'。它似乎工作,那么在这里添加'use'有什么好处? – 2010-10-22 15:37:42
@David:关于第二个问题,如果'M2'已经加载,那么'use M2'什么也不做(假设M2没有输出,如果它是OO类,它不应该输出)。但是在你尝试使用M2-> new之前,你必须已经加载了'M2'。 – Ether 2010-10-22 16:15:18