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;

次に、2つのオブジェクトを作成し、一方をもう一方の「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);

ただし、$ b(同じID)に相当するオブジェクトが多数のメソッドでインスタンス化され、いずれか1つで変更を行うことができるため、作成したすべてのオブジェクトの参照を渡すことが困難なWebアプリケーションのシナリオがあります。

理想的には、

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 によって参照される必要がある 2 つのセル間の隣接関係自体がオブジェクトではないでしょうか。1 つのセルの BCC 値を変更すると、関係オブジェクトに渡され、両方のセルが更新されます。

  • あなたがすべきことは、セルへのオブジェクト参照を$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 に答える