2015-08-28 11 views
14

Secondo http://elixir-lang.org/getting-started/basic-types.html#atoms:Perché è utile avere un tipo di atomo (come in elixir, erlang)?

Gli atomi sono costanti in cui il loro nome è il loro proprio valore. Alcune altre lingue chiamano questi simboli

Mi chiedo quale sia il senso di avere un tipo di atomo. Probabilmente per aiutare a costruire un parser o per macro? Ma nell'uso quotidiano come aiuta il programmatore?

BTW: non utilizzare mai elisir o Erlang, appena nota esistere (anche in KDB)

+0

Perché è utile avere un tipo enum in molte altre lingue? Quando hai bisogno di un simbolo per rappresentare un valore che * è * quel simbolo, perché la semantica del simbolo stesso è importante - allora vuoi gli atomi. Un enum è un modo per implementarlo, gli atomi di Erlang sono un altro.Sono più concisi e soggetti a molte meno restrizioni imposte dall'implementazione, e non si espongono agli hack in quanto "in C tutto è un intero sotto". – zxq9

risposta

6

Penso che uno degli usi più comuni di erlang sia quello di taggare variabili e messaggi, con il vantaggio del confronto veloce (pattern match) come dice mipadi.

Ad esempio, si scrive una funzione che potrebbe non riuscire in base ai parametri forniti, lo stato della connessione a un server o qualsiasi motivo. Un utilizzo molto frequente è di restituire una tupla {ok, Valore} in caso di successo, {errore, motivo} in caso di errore. La funzione di chiamata avrà la possibilità di gestire solo la codifica del caso di successo {ok,Value} = yourModule:yourFunction(Param...). Facendo questo è chiaro che consideri solo il caso di successo, estrai direttamente il valore dalla funzione return, è veloce, e non devi condividere alcuna intestazione con yourModule per decodificare l'atomo ok.

Nel messaggio ti capiterà spesso di vedere le cose come {add,Key,Value}, {delete,Key}, {delete_all}, {replace,Key,Value}, {append,Key,Value} ... Si tratta di messaggi espliciti, con gli stessi vantaggi come accennato prima: veloce, sensibile, non la quota di intestazione ...

+0

Ok, penso che questa risposta sembri più utile: quindi, usare gli atomi, aiutare a evitare di creare nuovi tipi/vars per concetti semplici, è come returnCodes ma auto-leggibile .. è comprensibile ok? – mamcx

+0

Sì, è corretto. Mentre userete erlang (o elisir) troverete molti casi d'uso in cui le caratteristiche auto-leggibili, auto-condivise e superveloci di atomo sono davvero ciò di cui hai bisogno. ** Un avvertimento **: dovrebbe essere un'informazione statica, nel senso che dovresti evitare di creare dinamicamente nuovi atomi. – Pascal

32

Sono fondamentalmente stringhe che possono essere facilmente testati per l'uguaglianza.

Considera una stringa. Concettualmente, generalmente vogliamo pensare che le stringhe siano uguali se hanno gli stessi contenuti. Ad esempio, "dog" == "dog" ma "dog"! = "Cat". Tuttavia, per verificare l'uguaglianza delle stringhe, dobbiamo verificare se ogni lettera in una stringa è uguale alla lettera nella stessa posizione in un'altra stringa, il che significa che dobbiamo percorrere ogni elemento della stringa e controllare ogni personaggio per l'uguaglianza. Ciò diventa un po 'più ingombrante se si ha a che fare con stringhe Unicode e bisogna considerare diversi modi di comporre caratteri identici (ad esempio, il carattere é ha due rappresentazioni in UTF-8).

Sarebbe molto più semplice se memorizzassimo stringhe identiche nella stessa posizione in memoria. Quindi, controllare l'uguaglianza sarebbe un semplice puntatore o confronto tra indici.

Come conseguenza della memorizzazione di stringhe identiche nella stessa posizione nella memoria, è anche possibile memorizzare una copia di ogni tipo di stringa univoco indipendentemente dal numero di volte in cui viene utilizzato nel programma, risparmiando così memoria per le più comuni stringhe pure.

Ad un livello più alto, l'uso degli atomi ci consente anche di pensare alle stringhe allo stesso modo in cui pensiamo ad altri tipi di dati primitivi come gli interi.

+1

Hai risposto meglio. Nessuna delle altre risposte evidenzia l'ovvia domanda "perché non usare le stringhe?" – Tallboy

2

Gli atomi sono costanti con se stesso come valore. Questo è un concetto molto utile nei sistemi distribuiti, dove le costanti possono essere definite in modo diverso su ciascun sistema, mentre gli atomi sono auto-contenenti senza bisogno di definizione.

+0

Penso che potresti esprimere un concetto più astratto nella posizione del sistema di distribuzione. Ma qual è il modo di "auto-contenimento" e quale "definizione" sarà salvata? – LoranceChen