PBJ*_*PBJ 6 arrays perl clone moose
我有一个Moose对象:
class My::Game {
has 'players' => (isa => 'Set::Object', ...)
has 'action_sequence' => (isa => 'ArrayRef[My::Game::Action]', ...)
}
Run Code Online (Sandbox Code Playgroud)
现在我希望能够通过调用克隆此对象,$game2 = $game->clone;如何深度克隆它以便克隆ArrayRef中的对象?更巧妙的是,Set :: Object?
我看过MooseX :: Clone,但我不清楚如何将它应用于这种情况.示例代码将不胜感激.
谢谢!
我没有使用过这里的任何一个部分(MooseX :: Clone,MooseX :: Compile和Set :: Object),所以这里只是一个粗略的概述我从哪里开始,从我对文档和常识的回顾穆斯建筑:
traits => ['Array'],它就足够聪明了克隆方法实际上是通过定义handles => { clone => [ 'map', 'clone' ] }- 即通过在每个成员元素上调用clone()来克隆属性) - 这可能是你提交第一个补丁的地方事实证明,只需将MooseX::Clone角色添加到类中就可以提供一种clone()递归克隆属性的方法。
traits => ['Clone']到属性,它将通过调用clone()属性值来递归克隆该属性。为了支持 cloning Set::Object,我最终创建了一个CloneByCoercion通过子类化特征来调用的Clone特征,并使用克隆之前强制转换的类型进行参数化。
因此,为了使用它,我写道:
has 'blah' => (isa => 'Set::Object', is => rw,
traits => ['CloneByCoercion' => {to=>'ArrayRef'}]
);
Run Code Online (Sandbox Code Playgroud)
MooseX::Types::Set::Object提供对 ArrayRef 的强制转换(尽管我需要修补其中的一个错误:对 ArrayRef 的强制转换应该返回一个引用,而不是一个列表)
我还进行了修改MooseX::Clone以保留对象可见的哈希值,以便它支持克隆具有循环引用的互连对象结构。
我最终会抽出时间将这些内容放在 CPAN 上或向模块提交补丁。
| 归档时间: |
|
| 查看次数: |
1111 次 |
| 最近记录: |