Entschuldigung für die generische Frage. Ich habe überall gesucht und so viele ähnliche Themen gefunden, aber keine, die meine spezifische Frage beantworten - vielleicht, weil der gesuchte Begriff nicht einmal existiert.
Ein Freund von mir lernt gerade Programmieren, speziell JavaScript, und er hat mich gefragt, warum das nicht funktioniert hat:
var a = "Hello World";
a.replace("Hello", "Goodbye");
console.log(a) // Logs "Hello World"
Der Grund dafür ist, dass replace
keine Änderungen vorgenommen werden a
, da Zeichenfolgen in JavaSript unveränderlich sind. Da es eine Zeichenfolge zurückgibt , müssten Sie etwas tun wie ...
var a = "Hello World";
a = a.replace("Hello", "Goodbye");
console.log(a); // Logs "Goodbye World"
Die Alternative ist jedoch eine Funktion wie die von JavaScript reverse()
, da sie alle ihre Aufrufe ändert. Beispielsweise:
var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();
console.log(fruits) // ["Bananas", "Oranges", "Apples"]
Als mein Freund mich fragte, warum er replace
nicht funktioniere, bemerkte ich, dass ich nach einem Wort griff, das ich nicht kenne (soweit ich weiß) ...
„Sie müssen setzen die Zeichenfolge‚string Punkt ersetzen‘, weil die Ersetzen - Funktion ________ ist.“
Sie nicht brauchen , zu setzen eine Reihe gleich „Array dot - Reverse“, weil umgekehrt ________ ist.“
Ich kenne mich mit Prototypfunktionen aus, obwohl ich nicht glaube, dass das das gesuchte Wort ist. Kann mir jemand helfen, diese Lücken auszufüllen?
quelle
You don't need to set an array equal to "array dot reverse", because reverse is a mutator function
. Ich denke, ich habe diese Terminologie gehört, um auf Funktionen zu verweisen, die die Instanz "mutieren", die sie aufruft. Aber Sie sollten das wahrscheinlich woanders noch einmal überprüfen.Antworten:
Das Paar von Konzepten, nach denen Sie suchen, sind veränderbare / unveränderliche Parameter und vorhandene / zurückgegebene Ergebnisse.
In Ihren Beispielen:
Sie müssen den String auf "string dot replace" setzen, da die Ersetzungsfunktion auf einen String angewendet wird, der in Python unveränderlich ist, sodass die Ersetzungsfunktion einen neuen String zurückgibt .
Für einen C / C ++ - Programmierer ist dies eher als "als Wert übergeben" als als "als Referenz übergeben" bekannt, wodurch sie unveränderlich werden und das Ergebnis zurückgeben.
Sie müssen ein Array nicht gleich "Array-Punktumkehr" setzen, da die Umkehrung auf ein Array angewendet wird, das veränderlich ist und daher vor der Rückkehr Änderungen an Ort und Stelle vornehmen kann .
In Sprachen wie C / C ++ wird dies als Parameter bekannt „bestanden by reference“ dh die Adresse vorbei , die, wenn unmodifizierte durch
const
, um die Funktion ändern kann, mutieren , der Inhalt dieser Adresse , um die Ergebnisse zu verändern am Ort vor der Rückkehr.Natürlich ist es nicht ungewöhnlich , eine Funktion zu haben , dass die Renditen Ergebnisse beiden Mechanismen, zB
int SomeFn(int p1, int p2, int *ErrCode)
können, möglicherweise Ergebnisse zurück sowohl im Rückgabewert und durch den Inhalt zu modifizierenErrCode
.Eine dritte Methode
Der Vollständigkeit halber ist ein dritter Mechanismus zum Zurückgeben von Ergebnissen nebenwirkend oder global , dh Ändern des Dateibereichs, programmweiter, gemeinsamer oder Umgebungswerte. Dies wird im Allgemeinen als schlechte Nachricht angesehen, da Sie, sofern nicht sehr gut dokumentiert, nur durch sorgfältiges Lesen des Codes herausfinden können, was geändert wird. In Sprachen wie C / C ++ ist dies nur allzu einfach möglich, wenn eine äußere Bereichsvariable mit einem bestimmten Namen, möglicherweise sogar in einem anderen Modul, und keine maskierende lokale Bereichsvariable mit demselben Namen vorhanden ist. In Python können Sie zwar die Werte von Werten in äußeren Gültigkeitsbereichen lesen, es sei denn, die Werte in äußeren Gültigkeitsbereichen sind explizit als verfügbar festgelegt und können mit geändert werden
global
Wenn Sie mit dem Schlüsselwort versuchen, eine äußere Bereichsvariable zu ändern, wird automatisch eine lokale Variable mit demselben Namen erstellt.quelle
(The reverse function is a _______ function.
) Davon abgesehen ist dies fast die gleiche Antwort wie die, die ich letztendlich meinem Freund gegeben habe. Ich freue mich über Ihre Bestätigung, obwohl ich mich immer noch frage, ob es bestimmte Begriffe gibt. Ich lasse die Frage noch etwas offen, werde sie aber als Antwort auf den Fall akzeptieren, dass diese Wörter einfach nicht existieren.Mein bevorzugter Ausdruck ist:
Die Array-
reverse
Methode mutiert . Es ist ein Mutator . Ein häufiger Sonderfall ist ein Setter .Die String-
replace
Methode ist nicht mutierend . Es ist kein Mutator . Wenn es nicht ändern nichts , es ist nebenwirkungsfreie . Ein häufiger Sonderfall ist ein Getter .Da JavaScript-Zeichenfolgen unveränderlich sind , können Zeichenfolgenmethoden nicht mutiert werden.
sollte dich unwohl machen. Ein Zeichenfolgenliteral wird nicht geändert. Das Ergebnis wird verworfen. Statische Code-Analysatoren können solche Fehler manchmal erkennen.
quelle
Manchmal habe ich im Zusammenhang mit der reinen funktionalen Programmierung Funktionen gehört, die den Eingabewert ändern (und daher keine reinen Funktionen sind) und als destruktiv bezeichnet werden . Ich bin mir jedoch nicht sicher, ob dies der richtige Begriff ist.
In Ihrem Fall würden Sie sagen:
quelle
Vielleicht ist das Wort, nach dem Sie suchen, rein ?
replace()
ist (oder scheint) rein, weil es nicht so aussieht, als ob es irgendwelche Nebenwirkungen hätte (dh die Zeichenkette modifizieren), währendreverse()
es unrein ist, weil es den Zustand des Arrays verändert.quelle
Diese werden normalerweise in Funktionen und Methoden unterteilt (wobei Methoden eine Teilmenge von Funktionen sind). Eine Funktion ist ein Codeabschnitt, der isoliert aufgerufen werden kann, während eine Methode ein Konzept eines aktuellen "Kontexts" hat, in dem sie ausgeführt wird. Die Aktion einer Methode ändert den Zustand ihres Kontexts.
Bei der objektorientierten Programmierung ist der Kontext die Instanz, auf der die Funktion ausgeführt wird.
quelle
Ich weiß nicht, ob es eine offizielle Antwort gibt, aber hier sind zwei, die Ihnen gefallen könnten.
Verfahren
Nur weil es eine gute Antwort auf diese Frage zu sein schien , die Ihrer Frage übrigens sehr ähnlich sieht - Sie sollten es sich ansehen.
In-Place-unary-Betrieb
Bewerten Sie diese Seite: java.util.function . Es bietet eine Art erfundenen Namen für Delegierte (Eingabe- / Ausgabesignaturen) verschiedener Prototypen, z. B. ein Delegat, der ein Argument annimmt und nichts zurückgibt, wird als Verbraucher bezeichnet .
Als geschickter Schüler von OOP sollten Sie sich darüber im Klaren sein, dass eine Methode nur eine Funktion ist, die einen versteckten Parameter übernimmt (
this
). Da es als Referenz geliefert wird, dient es sowohl als Eingabe- als auch als Ausgabeparameter.Diesen Java-Typen zufolge (und sie scheinen ziemlich schlau zu sein) wird ein Delegat, der eine einzelne Eingabe akzeptiert und einen Wert desselben Typs zurückgibt, als unärer Operator bezeichnet .
In diesem Fall
array::Reverse()
ist ein Array nicht unveränderlich und kann möglicherweise viel Platz beanspruchen. Daher ist es effizienter und bequemer, die Operation vor Ort durchzuführen. DaherReverse()
handelt es sich um einen unären In-Place-Operator .Aber für mich ist ein "Operator" ein spezielles Symbol (wie der Additionsoperator, auch bekannt als
+
) oder ein mathematisches Schlüsselwort wiemod
. Deshalb bevorzuge ich es eine OPERATION nennen Ion , wodurch man in-place unäre Operation .quelle
Reverse()
kein Operator ist, braucht ein unärer Operator keinen Wert des gleichen Typs zurückgeben (zB!
,delete
,typeof
) und Betreiber sind nicht Delegierten. "In-Place" ist jedoch eine gute Bezeichnung für eine Methode, die ihre Instanz ändert. [Ich habe nicht herabgestimmt, aber es sieht so aus, als hätte jemand alle Antworten herabgestimmt, obwohl sie alle nützlich sind.]Reverse()
um eine unäre Operation. Aber insgesamt stimme ich zu, dass dies alles ein wenig seltsam ist, aber ich verwende wörtlich die Terminologie des verlinkten Dokuments , das von einigen ziemlich klugen Leuten verfasst worden zu sein scheint. Zumindest ist es besser als nichts.