()
è semplicemente una tupla senza valori; una tupla 0. Il tipo e il valore sono scritti allo stesso modo, entrambi ()
. Il tipo è talvolta noto come "tipo di unità"; in realtà era un tipo distinto nel compilatore, ma ora è trattato come una tupla degenerata. È un tipo di dimensioni 0; oggetti di questo tipo non occuperanno mai spazio, sebbene sia un tipo Sized
, con una dimensione pari a 0.
Viene utilizzato per i casi in cui è necessario avere un valore o un tipo, ma si non hanno nulla di rilevante da mettere lì. Ad esempio, se si dispone di una funzione che non restituisce un valore e lo chiama in un luogo che si aspetta un valore, si scopre che in realtà restituisce il valore ()
di tipo ()
.
fn nothing() {}
fn main() {
println!("{:?}", nothing());
}
che stampa ()
(playpen).
Un altro utilizzo è quando si dispone di un tipo generico come Result<T, E>
, che indica un esito positivo o negativo di qualche operazione e può contenere il risultato dell'operazione riuscita o un errore che indica il motivo per cui non è riuscito. Alcune operazioni, come ad esempio std::io::write
che non hanno alcun valore da restituire in caso di successo ma vogliono essere in grado di indicare un errore, restituiranno un std::io::Result
<()>
, che in realtà è un sinonimo di Result
<(), std::io::Error>
; questo permette alla funzione di restituire Ok(())
nel caso di successo, ma qualche errore significativo quando fallisce.
È possibile confrontarlo con void
in C o C++, che vengono utilizzati anche per la mancanza di valore di ritorno. Tuttavia, non è possibile scrivere un oggetto con tipo void
, il che rende lo void
molto meno utile nella programmazione generica; non potresti mai avere un tipo Result<void, Error>
equivalente, perché non potresti mai costruire il caso Ok
.
In questo caso, un Mutex
normalmente esegue il wrapping e l'oggetto a cui si desidera accedere; quindi puoi mettere quell'oggetto nel mutex e poi accedervi dalla guardia che ottieni quando blocchi il mutex.Tuttavia, in questo esempio non sono presenti dati effettivi, pertanto viene utilizzato ()
poiché è necessario inserire qualcosa, e Mutex
è generico sul tipo in modo che possa accettare qualsiasi tipo.
Forse aggiungi la nozione di "vuoto"? La maggior parte dei programmatori conosce il "vuoto", quindi sarebbe d'aiuto, giusto? –
@LukasKalbertodt: C'è un costo per 'void', tuttavia, è irregolare. Nella programmazione di template C++ per esempio 'void' è un incubo. D'altra parte, '()' è perfettamente integrato nel sistema di tipi => è solo una tupla come le altre. –
@MatthieuM. Giusto, ma ** I ** penso ancora che sarebbe di aiuto ai programmatori provenienti da altre lingue per confrontarlo con 'void' ... –