Ich habe diese Funktion gerade in dem Projekt gefunden, an dem ich arbeite:
-- Just returns the text unchanged.
-- Note: <text> may be nil, function must return nil in that case!
function Widget:wtr(text)
return text
end
Zu schade, dass der Programmierer nicht mehr in der Firma arbeitet. Warum sollte man eine Funktion erstellen, die nichts tut, aber den Parameter zurückgibt, mit dem sie aufgerufen wird?
Gibt es eine Verwendung für eine solche Funktion, die in diesem Beispiel nicht angegeben ist, aber insgesamt auf jeden Fall?
Durch
function aFunction(parameter)
return parameter
end
Endet in
aFunction(parameter) == parameter
Warum sollte ich so etwas schreiben?
aFunction(parameter) == whatIWantToCheck
Anstatt von
parameter == whatIWantToCheck
?
functions
parameters
lua
method-chaining
Sempie
quelle
quelle
this
.int getParam(int param) { //DO NOTHING return param; }
Aus Sicht der Methodenverkettung ist dies ein völlig redundanter und unnötiger Aufruf, da Sie die Funktion des OP aus einer Methodenverkettung herausnehmen können und es keinen einzigen Unterschied machen würde.new Foo()->method();
war die Syntax ungültig und Konstrukte wiefunction with($what) { return $what; }; with(new Foo())->method();
wurden als Workaround verwendet.Antworten:
Ihre Frage ist ungefähr so, als würden Sie fragen, was der Wert der Zahl Null ist, wenn Sie bei jeder Addition den gleichen Wert zurückerhalten. Eine Identitätsfunktion ist wie die Null für Funktionen. Eigentlich nutzlos, aber gelegentlich nützlich als Teil eines Ausdrucks mit Funktionen höherer Ordnung, bei dem Sie eine Funktion als Parameter verwenden oder als Ergebnis zurückgeben können. Aus diesem Grund haben die meisten funktionalen Programmiersprachen eine
id
oderidentity
in ihrer Standardbibliothek.Anders ausgedrückt, es ist eine praktische Standardfunktion. So wie Sie vielleicht
offset = 0
eine Standard-Ganzzahl festlegen möchten , obwohl dadurch ein Offset nichts bewirkt, kann es nützlich sein,filterFunction = identity
eine Standardfunktion festzulegen, obwohl der Filter dadurch nichts bewirkt.quelle
filter
Funktion höherer Ordnung übergeben wird. Einefilter
Funktion erster Ordnung hat den Typ[a] -> [a]
,.OrderBy(x => x)
Sicher. Stellen Sie sich eine externe API vor, mit der Sie Dinge von einem Ort abrufen können, den Sie unbedingt benötigen. Sie müssen jedoch Filterkriterien und Ausgabeformatierer für jede Abfrage angeben, auch wenn Sie alle Ergebnisse genau so erhalten möchten, wie sie gespeichert sind.
Dann müssten Sie eine triviale Funktion "Alles akzeptieren" und eine triviale Funktion "Unverändert zurückgeben" erfinden, um an die Daten zu gelangen.
wtr
ist genau so ein trivialer Pseudoformatierer. Wenn Sie diese API häufig verwenden, kann es sehr nützlich sein, diese Pseudohilfsfunktion herumliegen zu lassen, anstatt bei jeder Abfrage eine anonyme Funktion erstellen zu müssen. (Sie könnten esidentity
eher nennen als,wtr
damit es sofort klar ist, dass es nichts tut.)quelle
null
als Argument verwenden Sie eine leere Filterfunktion , dass die Filter mit ‚nichts‘ , um das Programm aufhören , zu jammern zu machen.WHERE
Klausel entweder einschließen oder nicht einschließen können ? Das ist locker eine Frage des syntaktischen Zuckers. Im Wesentlichen ist das Fehlen einerWHERE
Klausel genau so, als ob Sie eineWHERE
Klausel hätten, die einfach weitergeht und alles zulässt. Die Tatsache, dass die SQL-Designer Sie keineWHERE
Klausel spezifizieren lassen , anstatt Sie zu zwingen, eine niederzuschreiben, selbst wenn sie alles akzeptiert, ist mehr oder weniger syntaktischer Zucker, und sie haben Ihnen diese Option nur zur Vereinfachung bereitgestellt. ..Ist das nicht nur ein Polymorphismus?
Aus meiner Erfahrung mit Qt
tr()
undwtr()
Methoden soll (dort, in Qt ) bei der Lokalisierung vonWidget
's Text verwendet werden.Also, indem unverändert Text Rückkehr diese Methode nur sagt:
Widget does no localization (translation of the text) by default. Override this function to enable your own logic
.quelle
Ein sehr häufiger Fall hierfür ist "später hinzugefügte Funktionalität". Daher dachte der Programmierer, dass diese Funktion später geändert werden könnte. Da Sie als Funktion und nicht als Parameter darauf zugreifen, können Sie dies leicht global ändern. Nehmen wir an, Sie haben einen Index mit:
und da Ihr Index bei 0 beginnt, ist alles in Ordnung. Wenn Sie später eine Komponente an einer anderen Stelle ändern, müssen Sie für diese Komponente Ihren Index so übersetzen, dass er bei 1 beginnt. Sie müssten überall in Ihrem Code Hunderte von Indizes + 1 hinzufügen. Aber mit einer Methode wie dieser sagen Sie einfach:
und Sie sind in Ordnung. Funktionen wie diese können schnell zu Überentwicklungen führen, machen aber an manchen Stellen sehr viel Sinn!
quelle
Solche Stub-Funktionen sind in Situationen mit Typvererbung üblich. Die Basisklasse macht möglicherweise nichts Nützliches, aber abgeleitete Klassen machen möglicherweise verschiedene Dinge mit den Eingaben. Deklarieren die Stub - Funktion in der Basisklasse ermöglicht alle abgeleiteten Klassen hat eine Funktion dieses Namen, und einzelne abgeleiteten Klassen außer Kraft setzt es mit etwas aufwendigeren und nützlich.
quelle
Ein weiteres Szenario ähnelt der Verwendung von Eigenschaften in Python und C #, jedoch in Sprachen, die nicht über diese Funktion verfügen.
Im Allgemeinen können Sie etwas nur als Mitglied der Klasse deklarieren. sagen wir mal 'name' als string. Dies bedeutet, dass Sie folgendermaßen darauf zugreifen:
Später entscheiden Sie, dass der Name wirklich von dem abhängen muss, was sich im Objekt befindet. Es sollte also wirklich eine Funktion sein. Hoppla! Sogar ohne Argumente bedeutet dies, dass der gesamte Code, der darauf zugreift, in geändert werden muss
Aber wenn Sie viele Instanzen dieses Aufrufs haben, ist die Wahrscheinlichkeit, dass nichts schief geht, sehr gering - irgendwo, wo diese Änderung nicht vorgenommen wird, stürzt das Programm ab, wenn Sie an diesem Punkt angelangt sind usw.
Mit den Eigenschaften in C # / Python können Sie eine Funktion durch ein früheres Attribut ersetzen, ohne dass der Zugriff darauf wie bei einem Attribut erfolgt, dh ohne Änderungen. Sie müssen nicht einmal vorausplanen.
Wenn Ihre Sprache das nicht hat, müssen Sie im Voraus planen, aber Sie können es trotzdem so unterstützen, wie es die Leute zuvor getan haben, indem Sie es von Anfang an zu einer Funktion machen, die nichts tut. Am Anfang macht es nichts Interessantes, und es sieht so aus, als ob es entfernt werden sollte, und viele Funktionen dieses Typs werden nie geändert. Aber später, wenn Sie feststellen, dass
Widget.wtr
es keine große Sache ist, einige Sonderzeichen auszublenden, wenn Sie wirklich anrufen - es ist bereits eine Funktion. Fügen Sie das einfach hinzu und Sie sind fertig.TL; DR Dies könnte ein weiser Programmierer sein, der zukünftige Änderungen plant.
quelle
print data
. Später wird Ihnen klar, dass alle Zeichenfolgen in Großbuchstaben geschrieben werden müssen. Sie müssen dann jeden Ausdruck in Ihrem Programm suchen und zu wechselnprint data.upper()
. Aber wenn Sie habendef cdata(data): return data
und überall sagenprint cdata(data)
, dann wechseln Sie einfach zudef cdata(data): return data.upper()
und es ist die einzige Änderung.Es ist nicht nutzlos, es kann sogar äußerst nützlich sein, da es Ihren Code einheitlicher und flexibler macht.
Angenommen, Sie haben eine Liste mit Personen und ein Dropdown-Menü, in dem der Benutzer auswählen kann, ob "alle" oder nur "männliche" oder "weibliche" Personen angezeigt werden sollen.
Sie können entweder "all" als Sonderfall behandeln. In diesem Fall benötigen Sie ein zusätzliches if, um diesen Fall explizit zu prüfen, oder Sie können eine Filterfunktion verwenden, die nur den Parameter zurückgibt (z. B. alles passieren lässt). zugewiesen, um für den "all" -Fall verwendet zu werden.
quelle
Filter
Klasse oder Schnittstelle mitMaleFilter
undFemaleFilter
Unterklassen haben und für Ihren Code ein Filter erforderlich ist, verwenden Sie einen Filter, der nichts bewirkt (der seinen Parameter unverändert zurückgibt)All
. Die Funktion tut nie etwas, sondern kann durch eine solche ersetzt werden.