3

假设我有以下 Moose 包:

package GSM::Cell;
use Moose;

has 'ID' => (is => 'ro', required => 1);
has [qw(BCCH NEIGHBOUR)] => (is => 'rw', default => undef);

no Moose;
__PACKAGE__->meta->make_immutable; 
1;

然后我创建两个对象并将一个添加为另一个的“NEIGHBOUR”属性:

my $a = GSM::Cell->new(ID => 20021, BCCH => 1);
my $b = GSM::Cell->new(ID => 20022, BCCH => 2);
$a->NEIGHBOUR($b);

在其他地方,例如在另一个过程中,$b 的 BCCH 属性可以更新为另一个值:

$b->BCCH(3);

现在,如果我指

 $a->NEIGHBOUR->BCCH

那么我仍然会取回 BCCH 属性的初始值,而不是更新后的值。

我想明智的做法是添加对 $b 而不是 $b 本身的引用,这将解决问题:

$a->NEIGHBOUR(\$b);

但是,我在 Web 应用程序中有这样的场景,其中一个等效于 $b(相同 ID)的对象在多种方法中被实例化,并且可以在任何一种方法中进行更改,这使得传递所有创建对象的引用变得困难。

理想情况下,当调用

my $somevar = GSM::Cell->new(ID => 20022);

制作完成后,只有在不存在具有相同 ID 的对象时才应创建对象。

是一本字典要走的路,像这样:

$id = 20022;
my $somevar = $already_created{$id} || GSM::Cell->new(ID => $id);

还是有更整洁的解决方案?

4

3 回答 3

3

这听起来像是MooseX::NaturalKey的设计目的。

package GSM::Cell;
use MooseX::NaturalKey;

has 'ID' => (is => 'ro', required => 1);
has [qw(BCCH NEIGHBOUR)] => (is => 'rw', default => undef);

primary_key => ('ID');
no Moose;
__PACKAGE__->meta->make_immutable; 
1;

然后后来:

my $a = GSM::Cell->new(ID => 20021, BCCH => 1);
my $b = GSM::Cell->new(ID => 20022, BCCH => 2);
$a->NEIGHBOUR($b);
$b->BCCH(3);
say $a->NEIGHBOR->BCCH; # prints 3

my $c = GSM::Cell->new(ID => 20022);
$c->BCCH(4);
say $a->NEIGHBOR->BCCH; # prints 4
于 2009-11-27T14:58:14.663 回答
2
  • 两个单元格之间的相邻关系本身不是一个对象,需要单元格 20021 和 20022 引用吗?然后可以将更改一个单元格上的密件抄送值传递给关系对象,从而更新两个单元格。

  • 您应该做的是将对单元格的对象引用存储在哈希中,例如 $Network 并通过工厂类控制单元格的创建,该工厂类知道检查 $Network 哈希以查找现有单元格...

于 2009-11-27T09:19:13.053 回答
1

我认为你帖子前半部分描述的问题是没有问题的。

如果我运行您的代码:

package GSM::Cell;
use Moose;

has 'ID' => (is => 'ro', required => 1);
has [qw(BCCH NEIGHBOUR)] => (is => 'rw', default => undef);

no Moose;
__PACKAGE__->meta->make_immutable; 
1;

package main;

my $a = GSM::Cell->new(ID => 20021, BCCH => 1);
my $b = GSM::Cell->new(ID => 20022, BCCH => 2);
$a->NEIGHBOUR($b);

$b->BCCH(3);
print $a->NEIGHBOUR->BCCH, "\n";  # 3

它打印更新的值,而不是旧值。它之所以有效是因为它$b是一个对象,并且所有 Perl 对象都是有福的引用。当你运行时,$a->NEIGHBOUR($b)你已经在传递一个引用;无需将引用传递给引用。

于 2009-11-27T14:25:23.747 回答