Das Pluszeichen +
wird zur Addition und zur Verkettung von Zeichenfolgen verwendet, aber sein Begleiter: Das Minuszeichen -
wird im Allgemeinen nicht zum Trimmen von Zeichenfolgen oder in einem anderen Fall als der Subtraktion verwendet. Was könnte der Grund oder die Einschränkungen dafür sein?
Betrachten Sie das folgende Beispiel in JavaScript:
var a = "abcdefg";
var b = "efg";
a-b == NaN
// but
a+b == "abcdefgefg"
coding-standards
history
operators
overload
Digvijay Yadav
quelle
quelle
+
mit den beiden völlig unabhängigen Bedeutungen „numerische Addition“ und „String-Verkettung“ überladen ist. Zum Glück bieten einige Sprachen einen separaten Verkettungsoperator wie.
(Perl5, PHP),~
(Perl6),&
(VB),++
(Haskell), ...->
(denken Sie, dass der Zugriff von Mitgliedern in C dereferenziert wird, da virtuelle Methodenaufrufe notwendigerweise eine zeigerartige Indirektion beinhalten). Es gibt kein Gesetz des Sprachdesigns, das Methodenaufrufe / Mitgliederzugriff erfordert, um einen.
Operator zu verwenden, obwohl dies eine zunehmend verbreitete Konvention ist. Wussten Sie, dass Smalltalk keinen Methodenaufrufoperator hat? Ein einfaches Nebeneinanderobject method
reicht aus.Antworten:
Kurz gesagt, es gibt keine besonders nützlichen subtraktionsähnlichen Operationen für Zeichenfolgen, mit denen die Leute Algorithmen schreiben wollten.
Der
+
Operator bezeichnet im Allgemeinen die Operation eines additiven Monoids , dh eine assoziative Operation mit einem Identitätselement:Es ist sinnvoll, diesen Operator für Dinge wie Ganzzahladdition, Zeichenfolgenverkettung und Mengenvereinigung zu verwenden, da alle dieselbe algebraische Struktur haben:
Und wir können damit handliche Algorithmen schreiben, wie eine
concat
Funktion, die mit einer Folge von „verkettbaren“ Dingen arbeitet, z.Wenn Subtraktion
-
involviert ist, spricht man normalerweise über die Struktur einer Gruppe , die für jedes Element A eine Inverse - A hinzufügt , so dass:Und während dies für Dinge wie Ganzzahl- und Gleitkommasubtraktion Sinn macht oder sogar Unterschiede festlegt, macht es für Strings und Listen nicht so viel Sinn. Was ist das Gegenteil von
"foo"
?Es gibt eine Struktur, die als abbrechendes Monoid bezeichnet wird und keine Inversen, sondern die Eigenschaft cancel hat , sodass:
Dies ist die Struktur, die Sie beschreiben, wo
"ab" - "b" == "a"
, aber"ab" - "c"
nicht definiert ist. Es ist nur so, dass wir nicht viele nützliche Algorithmen haben, die diese Struktur verwenden. Ich denke, wenn Sie Verkettung als Serialisierung betrachten, könnte Subtraktion für eine Art Analyse verwendet werden.quelle
+
Operation auch kommutativ für Zahlen,A+B == B+A
was sie zu einem schlechten Kandidaten für die Verkettung von Zeichenfolgen macht. Dies und die verwirrende Rangfolge der Operatoren machen die Verwendung+
von Zeichenfolgen für die Verkettung zu einem historischen Fehler. Es ist jedoch wahr, dass die Verwendung-
einer beliebigen String-Operation die Sache noch schlimmer gemacht hat….
von Perl ausgeliehen; Es ist~
in Perl6, möglicherweise auch in anderen..text.gz.text
...Da die Verkettung von zwei gültigen Zeichenfolgen immer eine gültige Operation ist, ist das Gegenteil nicht der Fall.
Was soll
a - b
hier sein? Es gibt wirklich keine gute Möglichkeit, diese Frage zu beantworten, da die Frage selbst nicht gültig ist.quelle
5 + False
natürlich ein Fehler zu sein , da eine Zahl kein Boolescher Wert und ein Boolescher Wert keine Zahl ist.(a+b)-b = a
(hoffentlich!), Aber(a-b)+b
ist das manchmala
, manchmala+b
abhängig davon, obb
ein Teilstring vorliegta
oder nicht? Was für ein Wahnsinn ist das?Weil der
-
Operator für die String-Manipulation nicht genügend "semantischen Zusammenhalt" hat. Operatoren sollten nur dann überladen werden, wenn absolut klar ist, was die Überladung mit ihren Operanden bewirkt, und die Zeichenfolgensubtraktion diesen Balken nicht erfüllt.Folglich werden Methodenaufrufe bevorzugt:
In der C # -Sprache verwenden wir
+
für die Verkettung der Zeichenfolgen das FormularAnstatt von
ist praktisch und wahrscheinlich leichter zu lesen, obwohl ein Funktionsaufruf vom semantischen Standpunkt aus wahrscheinlich "korrekter" ist.
Der
+
Bediener kann in diesem Zusammenhang wirklich nur eines bedeuten. Das ist nicht so wahr für-
, da der Begriff der Subtraktion Strings ist nicht eindeutig (der FunktionsaufrufReplace(source, oldValue, newValue)
mit""
als dernewValue
Parameter entfernt alle Zweifel, und die Funktion kann verwendet werden , Strings zu verändern, nicht nur um sie zu entfernen).Das Problem ist natürlich, dass die Überladung des Operators von den Typen abhängt, die an den Operator übergeben werden. Wenn Sie eine Zeichenfolge übergeben, bei der eine Zahl hätte stehen müssen, erhalten Sie möglicherweise ein Ergebnis, das Sie nicht erwartet haben. Darüber hinaus ist für viele Verkettungen (dh in einer Schleife) ein
StringBuilder
Objekt vorzuziehen, da bei jeder Verwendung von+
eine brandneue Zeichenfolge erstellt wird und die Leistung darunter leiden kann. Der+
Bediener ist also nicht in allen Zusammenhängen angemessen.Es gibt Operatorüberladungen, die eine bessere semantische Kohäsivität aufweisen als der
+
Operator für die Verkettung von Zeichenfolgen. Hier ist eine, die zwei komplexe Zahlen hinzufügt:quelle
Die Groovy-Sprache erlaubt
-
:kehrt zurück:
Und:
kehrt zurück:
Und:
kehrt zurück:
quelle
('ABABABABA' + 'B') - 'B'
annähernd den gleichen Wert wie der Startwert'ABABABABA'
.(A + B) - A == B
für jedes A und B. Kann ich das eine Links-Subtraktion nennen?++
für die Verkettung. Es funktioniert auf jeder Liste und eine Zeichenfolge ist nur eine Liste von Zeichen. Es hat auch\\
, was das erste Vorkommen jedes Elements im rechten Argument aus dem linken Argument entfernt.Das Pluszeichen ist wahrscheinlich in mehreren Fällen kontextbezogen sinnvoll, aber ein Gegenbeispiel (möglicherweise eine Ausnahme, die die Regel bestätigt) in Python ist das Set-Objekt, das Folgendes vorsieht,
-
aber nicht+
:Es macht keinen Sinn, das
+
Zeichen zu verwenden , weil die Absicht mehrdeutig sein könnte - bedeutet es, Schnittmenge oder Vereinigung zu setzen? Stattdessen wird|
für Vereinigung und&
für Schnitt verwendet:quelle
set('abc') ^ set('bcd')
kehrt zurückset(['a', 'd'])
, wenn Sie nach dem symmetrischen Unterschied fragen."
-
" wird in einigen zusammengesetzten Wörtern verwendet (z. B. "vor Ort"), um die verschiedenen Teile zu einem Wort zusammenzufügen. Warum verwenden wir nicht "-
", um verschiedene Zeichenfolgen in Programmiersprachen zusammenzufügen? Ich denke, es würde vollkommen Sinn machen! Zum Teufel mit diesem+
Unsinn!Betrachten wir dies jedoch aus einem etwas abstrakteren Blickwinkel.
Wie würden Sie String-Algebra definieren? Welche Operationen hätten Sie und welche Gesetze würden für sie gelten? Wie würden ihre Beziehungen sein?
Denken Sie daran, es darf absolut keine Mehrdeutigkeit geben! Jeder mögliche Fall muss genau definiert sein, auch wenn es bedeutet, dass dies nicht möglich ist! Je kleiner Ihre Algebra ist, desto einfacher ist dies.
Was bedeutet es beispielsweise, zwei Zeichenfolgen zu addieren oder zu subtrahieren?
Wenn Sie zwei Zeichenfolgen hinzufügen (zum Beispiel let
a = "aa"
undb = "bb"
), erhalten Sieaabb
als Ergebnis vona + b
?Wie wäre es
b + a
? Wäre dasbbaa
? Warum nichtaabb
? Was passiert, wenn Sieaa
vom Ergebnis Ihrer Addition abziehen ? Hätte Ihre Saite ein Konzept von negativem Inhaltaa
?Kehren Sie nun zum Anfang dieser Antwort zurück und ersetzen Sie
spaceshuttle
die Zeichenfolge. Warum ist eine Operation für einen Typ definiert oder nicht definiert?Der Punkt, den ich versuche, ist, dass nichts Sie daran hindert, eine Algebra für irgendetwas zu erstellen. Es kann schwierig sein, sinnvolle Operationen oder sogar nützliche Operationen dafür zu finden.
Für Streicher ist die Verkettung so ziemlich die einzig sinnvolle, die mir jemals begegnet ist. Es spielt keine Rolle, welches Symbol für den Vorgang verwendet wird.
quelle
'xy' * 3 == 'xyxyxy'
?