2016-03-24 13 views
2

私は '='をPerlで直接オーバーロードすることはできませんが、私は '='を使って自分のオブジェクトのコピーコンストラクタを呼び出せるようにしたいと考えています。Perlでコピーコンストラクタを呼び出すにはどうしたらいいですか?

例:

my $object1 = Object->new('value' => 1); 

# I want this to invoke the copy constructor of "$object1" instead of copying a reference 
my $object2 = $object1; 

# This should not modify "$object1" 
$object2->set_value(12); 

print $object1->get_value()."\n"; 
print $object2->get_value()."\n"; 

私は出力になりたい:

1 
12 

は、どのように私はこの作業を行うことができますか?

+4

Perlは、コンストラクタを持ってコピーするか、そうでない場合はありません。コンベンションは 'クローン'と呼ばれるメソッドを作ることです。 //オーバーロードされた演算子以外のオブジェクトが不変の場合は、[this](http://search.cpan.org/perldoc?overload#Copy_Constructor)を使用してコピーオンライトを実行できます。しかし、ここではそうではありません。 – ikegami

+0

私はオーバーロードされた演算子を除いて私のオブジェクトを不変にするかもしれないと思う。それは最もエレガントなアプローチかもしれないように見えます。 – tjwrona1992

+1

PerlはC++ではなくPerlとして扱ってください。何らかの形で他の言語で使用したセマンティクスを実行しようとすると、言語との幸せな関係は決してありません。 –

答えて

1

データを複製するには、Cloneモジュールを使用してください。

例:

package Foo; 
use parent 'Clone'; 
sub new { bless {}, shift } 

package main; 

my $obj = Foo->new; 
my $copy = $obj->clone; 
関連する問題