2017-05-05 5 views
0

Ich mag struct in der mi Klasse in perl.In Fall, dass jemand erklären, diese Funktion nicht wissen: http://perldoc.perl.org/Class/Struct.html Und dies ist mein Code:Declare Struktur in der Klasse Perl

package object; 
sub new{ 
    my $class = shift; 
    struct('object', { hashMap => '%', array => '@' }); 
    my $self = { 
     'object::hashMap' => shift , 
     'object::array' => shift , 
     _toret => shift // 0, 
    }; 
    $self->{_toret} = new object; 
    return bless $self, $class;  
} 

, wenn ich meine hasMap will aus struct, ich sollte ein Objekt dieses struct nennen, aber ich möchte es nicht in einer Funktion deklarieren, weil ich die Daten jedes Mal verliere, wenn ich die Funktion verweise. Und deshalb deklariere ich es in der Klasse. Das Problem ist, dass, wenn ich die Funktion tun, um die hasMap zu bekommen diese mir Fehler gibt und sagt mir, dass es

sub get{ 
     my($self) [email protected]_; 
     return $self->{_toret}->hashMap; 
    } 

Hashmap verwiesen werden cann't ich hoffe, dass Sie mir helfen können. Vielen Dank!!

+0

Was meinen Sie mit '$ self -> {_ toret} => neues Objekt;'? Meinst du stattdessen "="? – choroba

+0

Der Aufruf von 'new object' aus' object :: new' riecht nach unendlicher Rekursion. – choroba

+0

ohh ja !! ist $ self -> {_ toret} = neues Objekt; Es ist ein Fehler, scheitert aber immer noch –

Antwort

4

Ich denke, dass Sie dies massiv übermäßig komplizieren. Die struct()-Funktion sollte innerhalb des Paketcodes der obersten Ebene aufgerufen werden, nicht innerhalb des Konstruktors (das Aufrufen von struct() erstellt einen Konstruktor namens new() für Sie). Und das Rufen von new() von innerhalb new() scheint wie ein Rezept für eine Katastrophe.

Sie haben beschrieben, was nicht funktioniert, aber Sie haben nicht wirklich beschrieben, was Sie erreichen möchten. Ich denke, dass Sie das wollen (aber ohne nähere Details kann ich mir wirklich nicht sicher sein).

# Object is a terrible name for a class. 
# But if you insist on using it, at least capitalise the name. 
# Lowercase names are reserved for pragmata in Perl. 
package Object; 

use Class::Struct; 

struct(hashMap => '%', array => '@'); 

1; 

Sie dann Ihre Klasse wie folgt verwenden können:

use Object; 

my $obj = Object->new(
    hashMap => { foo => 1, bar => 2, baz => 3}, 
    array => [ 0 .. 10] 
); 

say $obj->hashMap->{foo}; # prints 1 
say $obj->array->[10]; # prints 10 

Wenn das nicht das, was Sie wollen, müssen Sie viel mehr darüber erklären, was Sie zu tun versuchen.