Quali sono alcuni casi d'uso di esempio per i letterali dei simboli in Scala?


93

L'uso di letterali simbolici non è immediatamente chiaro da quello che ho letto su Scala. Qualcuno vorrebbe condividere alcuni usi del mondo reale?

C'è un particolare idioma Java coperto da letterali simbolici? Quali lingue hanno costrutti simili? Vengo da un background Python e non sono sicuro che ci sia qualcosa di analogo in quella lingua.

Cosa mi spingerebbe a usare "HelloWorld vs" HelloWorld "?

Grazie

Risposte:


76

In termini Java, i simboli sono stringhe interne. Ciò significa, ad esempio, che il confronto di uguaglianza di riferimento ( eqin Scala e ==in Java) dà lo stesso risultato del confronto di uguaglianza normale ( ==in Scala e equalsin Java): 'abcd eq 'abcdrestituirà true, mentre "abcd" eq "abcd"potrebbe non, a seconda dei capricci di JVM (beh, dovrebbe per i letterali, ma non per le stringhe create dinamicamente in generale).

Altri linguaggi che utilizzano simboli sono Lisp (che usa 'abcdcome Scala), Ruby ( :abcd), Erlang e Prolog ( abcd; sono chiamati atomi invece di simboli).

Userei un simbolo quando non mi interessa la struttura di una stringa e lo userei puramente come nome per qualcosa. Ad esempio, se ho una tabella di database che rappresenta i CD, che include una colonna denominata "prezzo", non mi interessa che il secondo carattere in "prezzo" sia "r", o se concatenare nomi di colonne; quindi una libreria di database in Scala potrebbe ragionevolmente usare simboli per i nomi di tabelle e colonne.


25
Probabilmente vale la pena ricordare che == in Scala fa la cosa .equals, quindi la differenza sarebbe davvero quando si usa il metodo "eq" che fa riferimento all'uguaglianza. Un vantaggio, tuttavia, è che il confronto tra i simboli è estremamente economico.
Calum

@Calum, così come il confronto tra due stringhe. Java stagista (più o meno) tutte le stringhe.
Elazar Leibovich

4
@ Elazar: è proprio vero? Avevo l'impressione che Java internasse solo letterali (cioè quasi tutte le stringhe in esempi banali e quasi nessuna stringa nel software di produzione). Detto questo, i casi d'uso dei simboli sono di solito come valori letterali (dubito che spesso li costruisci da zero), quindi probabilmente il vantaggio principale che ottieni è solo un tipo più descrittivo.
Calum

1
@Elazar Non lo sono, perché i simboli possono fare affidamento sul fatto che il loro valore sia internato, mentre con le stringhe è opzionale e può ottimizzare alcuni casi d'uso. I simboli sono più simili a Enum creati dinamicamente che a qualsiasi altra cosa. Ho elaborato questo sulla risposta che ho collegato nella mia ultima risposta; per favore leggilo per saperne di più.
Calum

3
Quindi, "ciao mondo!" è una raccolta sequenziale di caratteri mentre 'helloWorld è un valore amichevole per le persone piuttosto che 14392.
CW Holeman II

26

Se hai stringhe semplici che rappresentano i nomi dei metodi nel codice, che forse vengono trasmessi, non stai trasmettendo le cose in modo appropriato. Questa è una sorta di problema del limite di dati / codice, non è sempre facile tracciare la linea, ma se dovessimo dire che in quell'esempio i nomi dei metodi sono più codice che dati, allora vogliamo qualcosa che lo identifichi chiaramente .

Un simbolo letterale entra in gioco in cui differenzia chiaramente solo i vecchi dati di stringa con un costrutto utilizzato nel codice. È solo lì dove vuoi indicare, non sono solo alcuni dati di stringa, ma in effetti in qualche modo parte del codice. L'idea di cose come il tuo IDE lo evidenzierebbe in modo diverso e, data la strumentazione, potresti rifattorizzare su quelli, piuttosto che eseguire la ricerca / sostituzione del testo.

Questo collegamento lo discute abbastanza bene.


1
Questa è una spiegazione utile. Mi fa pensare in termini di alternative alle enumerazioni - che possono essere goffe
javadba

2

Python mantiene una tabella globale interna di "stringhe interne " con i nomi di tutte le variabili, funzioni, moduli, ecc. Con questa tabella, l'interprete può effettuare ricerche e ottimizzazioni più veloci. Puoi forzare questo processo con la internfunzione ( sys.internin python3).

Inoltre, Java e Scala utilizzano automaticamente "stringhe interne" per ricerche più veloci. Con scala, puoi usare il internmetodo per forzare l'interno di una stringa, ma questo processo non funziona con tutte le stringhe. I simboli traggono vantaggio dalla garanzia di essere internati, quindi un singolo controllo dell'uguaglianza di riferimento è sufficiente per dimostrare l'uguaglianza o la disuguaglianza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.