2009-04-23 5 views
79

Die Verwendung von Symbolliteralen ist nicht sofort klar aus dem, was ich auf Scala gelesen habe. Würde es jemanden interessieren, einige echte Weltanwendungen zu teilen?Was sind einige Anwendungsfälle für Symbolliterale in Scala?

Gibt es ein bestimmtes Java-Idiom, das von Symbolliteralen abgedeckt wird? Welche Sprachen haben ähnliche Konstrukte? Ich komme aus einem Python-Hintergrund und bin mir nicht sicher, ob es in dieser Sprache etwas Ähnliches gibt.

Was würde mich motivieren, "HelloWorld vs" HelloWorld "zu verwenden?

Dank

Antwort

62

In Java ausgedrückt sind Symbole internierte Strings. Dies bedeutet beispielsweise, dass der Vergleich der Bezugsgleichheit (eq in Scala und == in Java) das gleiche Ergebnis liefert wie der normale Gleichheitsvergleich (== in Scala und equals in Java): 'abcd eq 'abcd wird wahr zurückgeben, während "abcd" eq "abcd" möglicherweise nicht, abhängig von JVMs Launen (gut, es sollte für Literale, aber nicht für Strings im Allgemeinen dynamisch erstellt werden).

Andere Sprachen, die Symbole verwenden, sind Lisp, Rubin (:abcd), Erlang und Prolog (die 'abcd wie Scala verwendet) (abcd, sie sind Atome anstelle von Symbolen genannt).

Ich würde ein Symbol verwenden, wenn mir die Struktur eines Strings egal ist, und benutze es nur als Namen für etwas. Zum Beispiel, wenn ich eine Datenbanktabelle habe, die CDs repräsentiert, die eine Spalte mit dem Namen "price" enthält, ist es mir egal, dass das zweite Zeichen in "price" "r" ist, oder über die Verkettung von Spaltennamen; Daher könnte eine Datenbankbibliothek in Scala sinnvolle Symbole für Tabellen- und Spaltennamen verwenden.

+22

Es ist wahrscheinlich wert, daran zu erinnern, dass == in Scala das tut.Gleiches Ding, so wirklich würde der Unterschied sein, wenn man die "eq" Methode benutzt, die Gleichheit referenziert. Ein Bonus ist jedoch, dass der Vergleich zwischen Symbolen extrem billig ist. – Calum

+0

@Calum, wie ist der Vergleich zwischen zwei Strings. Java Praktikanten (mehr oder weniger) alle Strings. –

+4

@Elazar: Stimmt das wirklich? Ich hatte den Eindruck, dass Java nur Literale internierte (d. H. Fast alle Strings in trivialen Beispielen und fast keine Strings in der Produktionssoftware). Wenn man sagt, dass die Use-Cases von Symbolen in der Regel wörtliche Werte sind (ich bezweifle, dass man sie oft von Grund auf neu erstellt), so ist der Hauptvorteil, den man bekommt, wohl eher ein beschreibender Typ. – Calum

24

Wenn Sie Normal Saiten repräsentieren in Code Methodennamen sagen, dass vielleicht um übergeben bekommen, sind Sie nicht ganz Dinge angemessen zu vermitteln. Dies ist eine Art der Grenze zwischen Daten und Code, es ist nicht immer einfach, die Linie zu zeichnen, aber wenn wir sagen würden, dass in diesem Beispiel die Methodennamen mehr Code als Daten sind, dann wollen wir etwas, um dies klar zu identifizieren .

Ein Symbol-Literal kommt ins Spiel, bei dem eindeutig nur alte Zeichenketten mit einem Konstrukt unterschieden werden, das im Code verwendet wird. Es ist nur wirklich dort, wo Sie angeben möchten, das ist nicht nur einige String-Daten, sondern in gewisser Weise Teil des Codes. Die Idee, Dinge wie Ihre IDE würde es anders hervorheben, und angesichts der Tooling, könnten Sie diese umgestalten, anstatt Text suchen/ersetzen.

Diese link diskutiert es ziemlich gut.

+1

Dies ist eine hilfreiche Erklärung. Es lässt mich in Bezug auf Alternativen zu Enums denken - das kann tollpatschig sein – javadba

1

Python hält eine interne globale Tabelle von "interned Strings" mit den Namen aller Variablen, Funktionen, Module usw. Mit dieser Tabelle kann der Interpreter schnellere Suchen und Optimierungen durchführen. Sie können diesen Prozess mit der Funktion intern (sys.intern in python3) erzwingen.

Auch Java und Scala verwenden automatisch "interned Strings" für schnellere Suchvorgänge. Mit scala können Sie die Methode intern verwenden, um den internen Wert einer Zeichenfolge zu erzwingen. Dieser Prozess funktioniert jedoch nicht mit allen Zeichenfolgen. Symbole profitieren davon, dass sie garantiert interniert werden, so dass eine einzige Referenzgleichheitsüberprüfung ausreicht, um Gleichheit oder Ungleichheit zu beweisen.

Verwandte Themen