Ich schreibe einen Code, in dem ich eine Subroutine als lvalue und als rvalue benutze, um Datenbankwerte zu lesen und zu schreiben. Das Problem ist, ich möchte, dass es anders reagiert, je nachdem, ob es als L-Wert oder als R-Wert verwendet wird.
Ich möchte, dass das Unterprogramm in die Datenbank schreibt, wenn es als lvalue verwendet wird, und aus der Datenbank liest, wenn es als rvalue verwendet wird.
Beispiel:
%Vor%Das einzige, was mir einfällt, ist, einen Weg zu finden, wie das Unterprogramm erkennt, ob es als L-Wert oder als R-Wert verwendet wird und auf jeden Fall anders reagiert.
Gibt es eine Möglichkeit, dies zu tun?
Die Entscheidung, wie man sich verhält, ob als lvalue aufgerufen wurde oder nicht, ist eine schlechte Idee, da foo(record_name(...))
es als lvalue bezeichnen würde.
Stattdessen sollten Sie entscheiden, wie Sie sich verhalten sollen, ob verwendet ist oder nicht.
Sie können das tun, indem Sie einen magischen Wert zurückgeben.
%Vor%Ein kleiner Test:
%Vor%Ausgabe:
%Vor% Nachdem Sie das gesehen haben, haben Sie sicherlich gelernt, dass Sie die Idee, ein Lvalue-Sub zu verwenden, aufgeben sollten. Es ist möglich, all diese Komplexität zu verbergen (zum Beispiel mit sentinel
), aber die Komplexität bleibt bestehen. Die Auffassungsgabe ist nicht die ganze Komplexität wert. Verwenden Sie separate Setter und Getter oder verwenden Sie einen Accessor, dessen Rolle auf der Anzahl der übergebenen Parameter basiert ( $s=acc();
vs acc($s)
).
In diesem Fall möchten Sie vielleicht mein Sentinel
-Modul ausprobieren.
Es stellt eine Funktion zur Verfügung, die Sie im Accessor verwenden können, um sie in einen mehr get / set Stil zu verwandeln. Z.B. Du könntest
%Vor%An dieser Stelle sind die folgenden Codezeilenpaare äquivalent
%Vor% Wenn Sie die spezifischen Methoden get_
und set_
der Methoden ebenfalls nicht angeben müssen, können Sie sie natürlich als Closures einfügen.
Weitere Informationen finden Sie in den Moduldokumenten.
Meiner Meinung nach waren lvalue Subroutinen in Perl eine dumme Idee. Unterstütze einfach ->record_name($subscript, $value)
als Setter und ->record_name($subscript)
als Getter.
Das heißt, Sie können das Want
-Modul wie dieses verwenden
obwohl dies auch als LVALUE behandelt wird:
%Vor% Wenn nur Zuordnungsanweisungen speziell behandelt werden sollen, verwenden Sie stattdessen want('ASSIGN')
.
Tags und Links perl rvalue subroutine lvalue