假設我有以下駝鹿包:當提供相同的必需屬性時,是否可以檢索現有的駝鹿對象,而不是創建新的駝鹿對象?
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;
我然後創建兩個對象,並添加一個作爲另一個的「鄰居的屬性:
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);
還是有整潔的解決方案?
MooseX :: NaturalKey將是一個理想的解決方案,但它似乎沒有做它做廣告:http://www.cpantesters.org/distro/M/MooseX- NaturalKey.html 您是否得到了上面的例子來工作? – 2009-11-30 09:00:30
看來MooseX-NaturalKey是用老版本的Class-MOP-Class編寫的。如果在MooseX :: NaturalKey :: Meta :: Class中將「override construct_instance => sub {」更改爲「override new_object => sub {」,則MooseX :: NaturalKey將按預期工作。 – 2009-11-30 14:06:46
我承認沒有嘗試過上面的例子。我會提交一個bug並跟進Sam(IRC上的mugwump)。他非常敏感。 – perigrin 2009-12-02 05:36:22