Frage

Ich verstehe nicht, was das sein könnte verwendet von lvalue Unterprogramme?Was ist es, ich kann nicht erreichen, die mit normalen Unterprogrammen?Könnten Sie bitte einige Beispiele nennen?

Vielen Dank

War es hilfreich?

Lösung

LValues sind empfohlen zu vermeiden.Sie machen Spaß und alles, aber Sie verwirren neue Benutzer, die Annahmen darüber, wie alle U-Boote der Arbeit, und damit sollte es vermieden werden, im code, wenn Sie einen besseren Weg zur Verfügung.

Manchmal kann es extrem praktisch in der Anwendung ein LValue Ergebnis zu tun, die schmutzige Arbeit.

substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring. 

Allerdings ist dies auch nicht die gleiche Sache:

substr( $string, $start, $stop , 'somevalue' ); 

Der Unterschied ist hier meist die erstere hat deutlich mehr Ausdruckskraft, wie es die Delegierten, die das Verhalten der code, der es verwendet, anstatt die Funktion selbst.

Zum Beispiel:

substr( $string, $start, $stop ) =~ s/a/b/g 

Würde Sie zwingen, das zu tun

my $x = substr( $string, $start, $stop ); 
$x =~ s/a/b/g/; 
substr( $string, $start, $stop, $x );

Das ist ein bisschen fies.

Obwohl, gibt es eine zusätzliche fiesen hier, weil Sie darüber nachdenken müssen, ob dabei, dass die substitution oder nicht mit $x funktioniert rückwirkend, die Zeichenfolge zu ändern oder nicht ( wegen substr ein LValue sub).Ich glaube nicht, aber Seiner zweideutigen genug, ich muss überprüfen das Handbuch, um zu merken, ob es funktioniert oder nicht, und das ist schlecht.

Andere Tipps

Sie können mit L-Wert-U-Boote als Einrichter für Objektelemente:

sub x : lvalue {
    my $self = shift;
    $self->{x};
}

Dann später:

$foo->x = 5;

Dies kombiniert die Anschaulichkeit der Mitglieder direkt mit der Flexibilität der Einkapselung der Setter, falls einstellen wollen Sie später ändern, wie das Objekt implementiert wird. Vergleichen Sie auf die folgenden traditionellere Wege Mitglieder in Perl zu setzen:

Intuitive aber zerbrechlich; was ist, wenn Sie ändern, wie $ foo umgesetzt wird?

$foo->{x} = 5;

Traditionelle Setter-Methode; keine Zuordnung Syntax verwenden, was beläuft sich auf eine Zuordnung:

$foo->set_x(5);

Natürlich haben lvalue Methoden nie wirklich von der Perl-Gemeinschaft angenommen wurden, und die Verwendung von L-Wert U-Boote ist „weird“ und was für Anschaulichkeit gewonnen würde wäre, alle von der Fremdheit davon verloren.

Sie bieten eine andere Schnittstelle, dass unter bestimmten Umständen kann intuitiver. Im Gegensatz zu herkömmlichen Setter, können Sie tatsächlich den Wert direkt ändern. Zum Beispiel

lvalue_sub($foo) =~ s/foo/bar/;

kann sauberer sein als

my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);

Ich kann sie viel in meinem normalen Perl Zeug für die Verwendung, nicht sprechen, aber sie werden in großem Umfang in der Perl Data Language verwendet, wenn Scheiben oder anderen Teilabschnitten eines piddle nehmen. Zum Beispiel:

my $a = sequence(100);
# use lvalue in this increment:
$a->where($a < 10)++;

# Zero-out the last four elements
# notice the use of the overloaded .= operator:
$a->slice("-10:") .= 0;

Wie viele Dinge in Perl, ist diese Funktion nicht viel über das gesamte Ökosystem verwendet wird, aber seine Verwendung zumindest in dieser Nische macht das Leben viel einfacher für die Benutzer von PDL.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top