2012-12-04 14 views
14

Quali sono le differenze esatte tra le variabili di sottolineatura e una variabile denominata che inizia con il carattere di sottolineatura dal punto di vista del compilatore Erlang (a parte l'aggiunta di leggibilità al codice)?Variabili anonime in Erlang

Ad esempio sono _ e _Var diversi? citazione

risposta

20

Il non importa variabile _ è un particolare variabile che corrisponde a qualsiasi cosa ed è MAI legato a un valore. È usato quando so che c'è qualcosa, ma non mi interessa quale sia il valore e non userò mai. Vedere _ non viene mai associato non può essere utilizzato in un'espressione e il compilatore lo contrassegna come un errore.

variabili come _Var sono variabili perfettamente normali che si può abbinare contro e saranno vincolati ai valori che significa che possono essere utilizzati nelle espressioni.Il prefisso di una variabile con _ è circa intent. Il compilatore normalmente ti avverte di una variabile che è legata a un modello ma non viene mai usata, spesso un segno di errore. Ma il compilatore non avvisa per le variabili con prefisso _ come in _Var. L'intento è che voglio dare un nome alla variabile, nominare le cose è buono, ma so che non lo userò mai.

Ricordare che _ è davvero l'unica variabile speciale e che _Var sono variabili normali e si comportano come tali se utilizzate. Se ti senti perverso allora puoi prefisso tutte le tue variabili con _ e tutto funzionerà ancora.

+0

Grazie! Questa era una risposta attraverso. :-) – coffeMug

18

di lasciare che il doc qui:

La variabile anonimo è indicata con sottolineatura (_) e può essere utilizzato quando è richiesta una variabile ma il suo valore può essere ignorato. [...]

variabili che iniziano con sottolineatura (_), ad esempio _Height, sono variabili normali, non anonima: sono tuttavia ignorati dal compilatore nel senso che non genereranno eventuali avvisi per le variabili non utilizzate .

In altre parole, si utilizza _Var forma quando è necessario l'espressione abbinato da abbinare - ma non vogliono usarlo ulteriormente E/o se si vuole mostrare il suo significato. E tu usi la variabile _ quando né tu né il compilatore dovresti preoccuparti dell'espressione che verrà abbinata.

Esempio 1:

member(_, []) -> []. 

In questa funzione non è del tutto chiaro che cosa le prime _ partite. Ma riscrittura direttamente, in questo modo:

member(Elem, []) -> []. 

... genererà un avvertimento, se il codice viene compilato con il flag warn_unused_vars set. È comunque possibile effettuare si codice leggibile qui, però, utilizzando variabile sottolineata:

member(_Elem, []) -> []. 

Esempio 2:

{_, _, Some} = {1, 2, 3} 

Questa tuple andrà comunque tutto bene, come i primi due elementi la tupla verrà ignorata completamente.

{_Var, _Var, Some} = {1, 2, 3} 

Questa corrispondenza non riuscirà, però: anche se _Var non dovrà essere utilizzato, deve essere 'riempito' con lo stesso valore! Poiché 1 non è uguale a 2, la condizione non riesce qui.

+0

OK, ma c'è qualche ragione per non utilizzare questo tipo di variabili che il loro nome inizia con un trattino basso? – coffeMug

+0

@AKh_Sw Dato che per lo più _do_ desidera l'avviso del compilatore per le variabili non utilizzate, è per questo che esiste. –

+1

@AKh_Sw Come spiegato alla fine della risposta (esempio 2), può creare badmatch. Immagina di avere un codice complesso, e dopo un refactoring decidi di non utilizzare una variabile precedentemente utilizzata, ma questa variabile si è verificata più volte in questo codice complesso. Metti semplicemente _ per non usarlo ma è effettivamente usato. Quindi potresti avere una cattiva corrispondenza inaspettata. Inoltre, la necessità di utilizzare le variabili di sottolineatura per documentare il codice viene talvolta considerata come un "odore di codice" e un invito a semplificarlo. –