vol*_*ron 9 oop perl deep-copy bless
我希望做一个深刻的(在这一点上,浅薄可能就足够了)一个受祝福的物体的副本.
Foo类
package Foo;
our $FOO = new Foo; # initial run
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
Run Code Online (Sandbox Code Playgroud)
主要计划
use Foo;
my $copy = $Foo::FOO; # instead of creating a ref, want to deep copy here
$copy->{bar} = 'bar';
Run Code Online (Sandbox Code Playgroud)
bar出现在两者$Foo::FOO和$copy.我意识到我可以通过设置为对象来创建对象的副本$copy = { %{$Foo::FOO} },但随后它将不再受到祝福; 另外,这只适用于简单的数据结构(现在不是问题).是这种方式复制然后保佑(例如$copy = bless { %{$Foo::FOO} }, q{Foo};)的唯一方法吗?
我试图避免使用Moose,Clone或其他非核心模块/软件包,因此在回复时请记住这一点. 粗体所以它更突出:)
cho*_*oba 11
复制应该是API的一部分.模块的用户永远不会知道在创建新对象时需要执行哪些特殊操作(考虑my在包中的散列中注册每个对象).
因此,clone为您的对象提供一种方法.在它里面,你可以使用你喜欢的任何脏技巧:
sub clone {
my $self = shift;
my $copy = bless { %$self }, ref $self;
$register{$copy} = localtime; # Or whatever else you need to do with a new object.
# ...
return $copy;
}
Run Code Online (Sandbox Code Playgroud)
$ corelist Storable
Storable was first released with perl v5.7.3
Run Code Online (Sandbox Code Playgroud)
另外,你可以摆弄Storable钩子,以便更好地控制复制你的对象(不是我已经完成了,但这就是文档所声称的).
| 归档时间: |
|
| 查看次数: |
6992 次 |
| 最近记录: |