it-swarm.com.de

Warum ist das Minuszeichen '-' im Allgemeinen nicht wie das Pluszeichen überladen?

Das Pluszeichen + wird zum Hinzufügen und zur Verkettung von Zeichenfolgen verwendet, aber sein Begleiter: das Minuszeichen - wird im Allgemeinen nicht zum Trimmen von Zeichenfolgen oder einem anderen Fall als der Subtraktion gesehen. 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"
65
Digvijay Yadav

Kurz gesagt, es gibt keine besonders nützlichen subtraktionsähnlichen Operationen für Zeichenfolgen, mit denen Benutzer Algorithmen schreiben wollten.

Das + Operator bezeichnet im Allgemeinen die Operation eines Additivs Monoid , dh eine assoziative Operation mit einem Identitätselement:

  • A + (B + C) = (A + B) + C.
  • A + 0 = 0 + A = A.

Es ist sinnvoll, diesen Operator für Dinge wie Ganzzahladdition, Zeichenfolgenverkettung und Mengenvereinigung zu verwenden, da alle dieselbe algebraische Struktur haben:

1 + (2 + 3) == (1 + 2) + 3
1 + 0 == 0 + 1 == 1

"a" + ("b" + "c") == ("a" + "b") + "c"
"a" + "" == "" + "a" == "a"

Und wir können es verwenden, um handliche Algorithmen wie eine concat -Funktion zu schreiben, die mit einer Folge von "verkettbaren" Dingen arbeitet, z.

def concat(sequence):
    return sequence.reduce(+, 0)

Bei Subtraktion - beteiligt sich, spricht man normalerweise über die Struktur einer Gruppe , die für jedes Element A eine inverse −A hinzufügt , damit:

  • A + - A = - A + A = 0

Dies ist zwar für Dinge wie Ganzzahl- und Gleitkommasubtraktion oder sogar für das Setzen von Unterschieden sinnvoll, für Zeichenfolgen und Listen jedoch weniger sinnvoll. Was ist die Umkehrung von "foo"?

Es gibt eine Struktur namens Cancellative Monoid , die keine Inversen hat, aber die Eigenschaft Cancellation hat, so dass ::

  • A - A = 0
  • A - 0 = A.
  • (A + B) - B = A.

Dies ist die Struktur, die Sie beschreiben, wobei "ab" - "b" == "a", aber "ab" - "c" ist nicht definiert. 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 die Subtraktion für eine Art Parsing verwendet werden.

116
Jon Purdy

Da die Verkettung von zwei beliebigen gültigen Zeichenfolgen immer eine gültige Operation ist, ist das Gegenteil nicht der Fall.

var a = "Hello";
var b = "World";

Was sollte a - b sei hier? Es gibt wirklich keine gute Möglichkeit, diese Frage zu beantworten, da die Frage selbst nicht gültig ist.

37
Mason Wheeler

Weil der Operator - Für die Zeichenfolgenmanipulation nicht genügend "semantischen Zusammenhalt" hat. Operatoren sollten nur ü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:

public string Remove(string source, string toRemove)
public string Replace(string source, string oldValue, string newValue)

In der C # -Sprache verwenden wir + Für die Verkettung von Zeichenfolgen, da das Formular

var result = string1 + string2 + string3;

anstatt

var result = string.Concat(string1, string2, string3);

ist bequem und wohl leichter zu lesen, obwohl ein Funktionsaufruf vom semantischen Standpunkt aus wahrscheinlich "korrekter" ist.

Der Operator + Kann in diesem Zusammenhang wirklich nur eines bedeuten. Dies gilt nicht so für -, Da der Begriff des Subtrahierens von Zeichenfolgen nicht eindeutig ist (der Funktionsaufruf Replace(source, oldValue, newValue) mit "", Wenn der Parameter newValue entfernt wird alle Zweifel, und die Funktion kann verwendet werden, um Teilzeichenfolgen zu ändern, nicht nur 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, an der eine Zahl hätte stehen sollen, erhalten Sie möglicherweise ein Ergebnis, das Sie nicht erwartet haben. Zusätzlich ist für viele Verkettungen (d. H. In einer Schleife) ein StringBuilder -Objekt vorzuziehen, da jede Verwendung von + Eine brandneue Zeichenfolge erzeugt und die Leistung darunter leiden kann. Der Operator + Ist also nicht in allen Kontexten geeignet.

Es gibt Operatorüberladungen mit einer besseren semantischen Kohäsivität als der Operator + Für die Verkettung von Zeichenfolgen. Hier ist eine, die zwei komplexe Zahlen hinzufügt:

public static Complex operator +(Complex c1, Complex c2) 
{
    return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
}
28
Robert Harvey

Die Groovy Sprache erlaubt -:

println('ABC'-'B')

kehrt zurück:

AC

Und:

println( 'Hello' - 'World' )

kehrt zurück:

Hello

Und:

println('ABABABABAB' - 'B')

kehrt zurück:

AABABABAB
8
Wim Deblauwe

Das Pluszeichen ist wahrscheinlich in mehreren Fällen kontextuell sinnvoll, aber ein Gegenbeispiel (möglicherweise eine Ausnahme, die die Regel bestätigt) in Python ist das gesetzte Objekt, das - aber nicht +:

>>> set('abc') - set('bcd')
set(['a'])
>>> set('abc') + set('bcd')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'set' and 'set'

Es macht keinen Sinn, das + Zeichen, weil die Absicht mehrdeutig sein könnte - bedeutet es, Schnittmenge oder Vereinigung zu setzen? Stattdessen wird | für Vereinigung und & für Kreuzung:

>>> set('abc') | set('bcd')
set(['a', 'c', 'b', 'd'])
>>> set('abc') & set('bcd')
set(['c', 'b'])
6
Aaron Hall

"-" Wird in einigen zusammengesetzten Wörtern (z. B. "vor Ort") verwendet, um die verschiedenen Teile zu demselben 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!

Versuchen wir jedoch, dies aus einem etwas abstrakteren Blickwinkel zu betrachten.

Wie würden Sie die 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 kann absolut keine Mehrdeutigkeit geben! Jeder mögliche Fall muss genau definiert sein, auch wenn dies 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 (z. B. a = "aa" Und b = "bb"), Erhalten Sie aabb als Ergebnis von a + b?

Wie wäre es mit b + a? Wäre das bbaa? Warum nicht aabb? Was passiert, wenn Sie aa vom Ergebnis Ihrer Addition abziehen? Würde Ihre Zeichenfolge ein Konzept der negativen Menge von aa enthalten?

Kehren Sie nun zum Anfang dieser Antwort zurück und ersetzen Sie spaceshuttle anstelle der Zeichenfolge. Warum ist eine Operation für einen Typ definiert oder nicht definiert?

Der Punkt, den ich versuche, ist, dass nichts Sie davon abhält, eine Algebra für irgendetwas zu erstellen. Es kann schwierig sein, sinnvolle Operationen oder sogar nützliche Operationen dafür zu finden.

Für Strings ist die Verkettung so ziemlich die einzige vernünftige, die mir jemals begegnet ist. Es spielt keine Rolle, welches Symbol zur Darstellung der Operation verwendet wird.

3
Zavior