2 Stimmen

Wie kann man Rückgabewerte dereferenzieren?

Ich habe immer wieder Probleme mit der Dereferenzierung, insbesondere bei der Rückgabe von Werten aus Funktionen.

Das Problem scheint zu sein, dass jedes Mal, wenn Sie etwas anderes als ein Skalar zurückgeben Sie tatsächlich zurückgeben, dass Objekt durch Verweis - das ist gut von mir - aber sagen, wenn wir diese Verweise an andere Funktionen übergeben und wir benötigen Zugriff auf ihre Eingeweide wieder wie wir das richtig tun?

Ich stoße immer wieder auf Fehler wie: "Erwartet eine gerade Anzahl von Parametern, die eine Referenz haben" oder etwas in der Art.

Gibt es eine allgemeine Faustregel, die ich anwenden kann, um diesen ganzen Prozess zu vereinfachen? Ich wünschte fast, ich müsste mich nicht um die Dereferenzierung kümmern!

Hier ist ein Beispiel für etwas, das ich versucht, früher heute zu tun, und lief in alle Arten von Dereferenzierung Probleme, die ich verbrachte ein paar Stunden versuchen, meinen Weg durch zu bashen - so nach dem Lesen, versuchen und scheitern, ich bin hier, um Sie für die Lowdown zu fragen.

Objekt "Person

Person
 has name [Str]
 has madeby [Str]
 has height [Num]
 has id [Num]

Verschiedene Möglichkeiten, ein Person-Objekt zu erstellen

sub person_maker{
 my($this,%options) = @_;
 my $person = Person->new(%options);
   return $person;
}

sub make_person_named_james{
 my($this,$options) = @_;
 my $default = { name => 'James', madeby => 'name' };
   $options = ($options,$defaults); #merge default and options hash
   return($this->person_maker($options));
}

sub make_person_from_id{
 my($this,$id) = @_;
 my $default = { name => 'nameless person', madeby => 'id' };
   $default = ($default,{ id => $id });
   return($this->person_maker($default);
}

sub make_person_from_person{
 my($this,$person) = @_;
 my $person_options = {
   name => $person->name().'_twin',
   height => $person->height(),
   id => $person->id() + 1,
   madeby => 'person'
 };
 return($this->person_make($person_options));
}
  • Func gibt zurück Hash Objekt => es kommt tatsächlich als Hash Referenz
  • Func gibt zurück Hash-Referenz \=> es kommt tatsächlich als skalar
  • Func gibt zurück Array Objekt => es gibt tatsächlich ein Array Referenz
  • Func gibt zurück Array-Referenz \=> er liefert tatsächlich eine skalar ?
  • Func gibt eine skalar \=> er gibt tatsächlich den Wert der Skalar?

Korrigieren Sie mich, wenn ich etwas davon falsch verstanden habe.

Dann ein weiteres Problem für mich ist an dem Punkt der Konsumierung der Argumente einer Funktion

Je nachdem, was ich zurückbringe, werden sich diese bösen Jungs unterschiedlich verhalten!

    sub myfunc{
      my($self,$args) = @_ # list of arguments (what if the args are mixed?)
  OR
      my($self,$args) = $_ # scalar (this wont work here $args will by undef
  OR
      my $self = shift; # pop the first arg
      my $args = shift; # pop the second arg
  OR
      my $self = $_[0] 
      my $args = $_[1]

Plus! Es gibt viel zu viele Dokumente, von denen viele veraltet sind, so dass es schwierig ist, genau herauszufinden, was in diesen Situationen das Richtige oder Beste ist.

Wenn jemand eine magische Tabelle, die buchstabiert, wenn diese verschiedenen Setups zu verwenden, und wie Dereferenz gegeben bestimmte Szenarien, gesegnet Hashes, Hash Ref, Scalar, etc etc. Ich würde ewig dankbar sein, wie ich Stunden verschwendet haben versucht, dies zu entziffern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X