2016-03-24 9 views
2

Ich weiß '=' kann nicht direkt in Perl überladen werden, aber ich möchte in der Lage sein, '=' zu verwenden, um den Kopierkonstruktor für eines meiner Objekte aufzurufen.Wie kann ich '=' einen Kopierkonstruktor in Perl aufrufen lassen?

Beispiel:

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"; 

Ich möchte die Ausgabe sein:

1 
12 

Wie kann ich diese Arbeit machen?

+4

Perl nicht Konstrukteure haben, kopieren oder auf andere Weise. Konvention ist eine Methode namens "Klon" zu erstellen. // Sie können [this] (http://search.cpan.org/perldoc?overload#Copy_Constructor) verwenden, um das Copy-on-Write auszuführen, wenn Ihr Objekt unveränderlich ist, außer durch überladene Operatoren. Aber das ist hier nicht der Fall. – ikegami

+0

Ich denke, ich kann mein Objekt unveränderlich machen, außer für überladene Operatoren. Das scheint der eleganteste Ansatz zu sein. – tjwrona1992

+1

Behandeln Sie Perl als Perl und nicht als C++. Wenn Sie versuchen, Semantik, die Sie mit anderen Sprachen verwendet haben, irgendwie zu erzwingen, werden Sie nie eine glückliche Beziehung mit der Sprache haben. –

Antwort

1

Zum Klonen von Daten können Sie Clone Modul verwenden.

Beispiel:

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

package main; 

my $obj = Foo->new; 
my $copy = $obj->clone; 
Verwandte Themen