2014-07-19 5 views
17

Rust ha il tipo di unità, (), un tipo con un valore pari a zero. Il valore di questo tipo di unità viene inoltre specificato utilizzando ().Qual è lo scopo del tipo di unità in Rust?

Qual è lo scopo del tipo di unità e il suo valore? È un meccanismo per evitare l'uso di n. (o) come altre lingue?

+1

È più simile a "vuoto" in lingue simili a C. Per quanto ne so, tutto è un'espressione in ruggine, quindi '()' è il valore restituito da qualcosa che viene eseguito solo per i suoi effetti. – Lee

+0

Puoi creare i tuoi tipi a dimensione zero, proprio come '()' dicendo 'struct MyNewZeroSizeType;' Può essere utile ("tipi di marcatori"!) – bluss

+1

Non sembra come 'null' in java perché se tu dì che restituisci un 'int' non puoi restituire'() 'al posto di esso. – JustGage

risposta

25

() è un valore del tipo () e il suo scopo è di essere inutile.

Tutto in Rust è un'espressione e le espressioni che restituiscono "nulla" restituiscono effettivamente (). Il compilatore darà un errore se si ha una funzione senza un tipo di ritorno ma si restituisce comunque qualcosa di diverso da (). Per esempio

fn f() { 
    1i // error: mismatched types: expected `()` but found `int` 
} 

ci sono usi pratici per () troppo. A volte non ci interessa un tipo generico, e lo () lo rende esplicito.

Ad esempio, un Result<(), String> può essere utilizzato come tipo di ritorno per una funzione completata correttamente o non riuscita per una serie di motivi.

+0

Supponiamo che si possano definire metodi per questo, ma non ci sarà nessuno stato associato a quelli ... È corretto? – errordeveloper

+1

@errordeveloper si, praticamente tutto ciò che si può fare con '()' ha un'implementazione banale. – huon

7

Se si proviene da un linguaggio simile a C (C, C++, Java, ecc.), È possibile considerare l'unità come void. È il tipo che ritorni quando non vuoi restituire nulla.

I teorici di tipo faranno notare che l'unità non è come nulla, perché l'unità ha esattamente 1 valore mentre il vuoto ha valori 0.

In pratica, la quantità di informazioni che è possibile memorizzare in entrambi i tipi è la stessa (0 bit) anche se le lingue che utilizzano l'unità tendono ad essere più piacevoli da utilizzare perché è possibile trattarle come qualsiasi altro valore.

È possibile memorizzarlo in una variabile, struttura, raccolta o in qualsiasi altro punto in cui è possibile memorizzare un valore. Puoi passare come argomento o restituirlo come risultato. È possibile creare un riferimento ad esso. Etc.

Quindi, quando è utile? Principalmente quando non ti interessa quale tipo di valore hai a che fare. Significa che puoi scrivere codice polimorfico/generico senza preoccuparti se il valore con cui stai trattando contiene effettivamente delle informazioni. Vale a dire, non c'è bisogno di casi particolari per se si sta memorizzando dati reali o ().

Un esempio di dove viene utilizzato è in HashSet. A è attualmente implementato come a thin wrapper around HashMap<T,()>. (Una mappa dal tipo generico T a ())