W języku Java symbole są łańcuchami wewnętrznymi. Oznacza to na przykład, że porównanie równości odniesień ( eq
w Scali i ==
Javie) daje taki sam wynik jak normalne porównanie równości ( ==
w Scali i equals
Javie): 'abcd eq 'abcd
zwróci wartość true, ale "abcd" eq "abcd"
może nie, w zależności od kaprysów JVM (cóż, powinno dla literałów, ale nie dla łańcuchów tworzonych dynamicznie).
Inne języki, które używają symboli to Lisp (który używa 'abcd
jak Scala), Ruby ( :abcd
), Erlang i Prolog ( abcd
; nazywane są atomami zamiast symboli).
Użyłbym symbolu, gdy nie obchodzi mnie struktura łańcucha i używam go wyłącznie jako nazwy czegoś. Na przykład, jeśli mam tabelę bazy danych reprezentującą płyty CD, która zawiera kolumnę o nazwie „cena”, nie obchodzi mnie, że drugi znak w polu „cena” to „r”, czy też konkatenacja nazw kolumn; więc biblioteka bazy danych w Scali mogłaby rozsądnie używać symboli dla nazw tabel i kolumn.
Jeśli masz w kodzie zwykłe ciągi reprezentujące nazwy metod powiedz, które być może są przekazywane, nie do końca przekazujesz rzeczy w odpowiedni sposób. Jest to rodzaj problemu z granicami danych / kodu, nie zawsze łatwo jest narysować linię, ale gdybyśmy mieli powiedzieć, że w tym przykładzie te nazwy metod są bardziej kodem niż danymi, to chcemy, aby coś wyraźnie to zidentyfikowało .
W grę wchodzi literał symbolu, który wyraźnie rozróżnia wszystkie stare dane łańcuchowe z konstrukcją używaną w kodzie. Po prostu jest tam, gdzie chcesz wskazać, nie są to tylko niektóre dane tekstowe, ale w rzeczywistości w jakiś sposób część kodu. Pomysł polegający na tym, że rzeczy takie jak twoje IDE podkreśliłyby to inaczej, a biorąc pod uwagę narzędzia, możesz je refaktoryzować, zamiast wyszukiwać / zastępować tekst.
Ten link dość dobrze to omawia.
źródło
Python utrzymuje wewnętrzną, globalną tabelę „wewnętrznych łańcuchów” z nazwami wszystkich zmiennych, funkcji, modułów itp. Dzięki tej tabeli interpreter może szybciej wyszukiwać i optymalizować. Możesz wymusić ten proces
intern
funkcją (sys.intern
w python3).Ponadto Java i Scala automatycznie używają „wewnętrznych ciągów znaków” w celu przyspieszenia wyszukiwania. Dzięki scali możesz użyć
intern
metody do wymuszenia stażysty ciągu, ale ten proces nie działa ze wszystkimi ciągami. Symbole korzystają z gwarancji internowania, więc jedno sprawdzenie równości odniesienia wystarczy, aby udowodnić równość lub nierówność.źródło
Uwaga:
Symbols
zostaną wycofane, a następnie usunięte w Scala 3 (dotty).Źródła: http://dotty.epfl.ch/docs/reference/dropped-features/symlits.html
Z tego powodu osobiście odradzam używanie go
Symbols
(przynajmniej w nowym kodzie scala). Jak stwierdza dokumentacja dotty:źródło