2010-07-14 124 views
7

什麼是正確方式從另一個駝鹿對象創建一個實例?在實踐中,我已經看到這種做法很多:從另一個Moose對象實例化Moose對象的正確方法?

$obj->meta->name->new() 
$obj->new() ## which has been deprecated and undeprecated 
(blessed $obj)->new() 
-- and, its bastard variant: (ref $obj)->new() 
$obj->meta->new_object() 

然後,如果你有traits?有沒有一種透明的方式來支持這一點?做任何這些工作與anonymous classes

+1

如在創建對象的「克隆」或同一對象的新實例? – 2010-07-14 23:09:18

+0

同一對象的新實例。 – 2010-07-15 01:41:16

+1

如果該實例具有角色,是否要保留它們? – Schwern 2010-07-15 09:32:38

回答

6

您的選擇,$obj->meta->name->new()(blessed $obj)->new()都是最安全的。

實現特徵的方法是,創建一個匿名子類並將角色應用於該子類,並將實例重新佈局到該子類中。這意味着這些解決方案中的任何一個都可以很好地處理特性。 Perl缺乏真正的匿名子類(每個包都必須有名稱空間),Moose通過在匿名類的通用名稱空間中創建一個名稱來解決此問題。

如果你花了一秒鐘的時間來嘗試一些示例代碼,你會看到這個實例。

$perl -Moose -E'with q[MooseX::Traits]; 
    package Role; use Moose::Role; 
    package main; say Class->with_traits(q[Role])->new->meta->name' 

    MooseX::Traits::__ANON__::SERIAL::1 

希望有幫助。