Quando si dichiara una variabile di tipo vettoriale o di una mappa hash a Rust, che facciamo:Perché Rust inserisce a :: before i parametri in generici a volte?
let v: Vec<int>
let m: HashMap<int, int>
per istanziare, abbiamo bisogno di chiamare new()
. Tuttavia, lo facciamo così:
Vec::<int>::new()
^^
HashMap::<int, int>::new()
^^
nota l'improvvisa comparsa di ::
. Venendo dal C++, questi sono strani. Perché si verificano? Avere un ::
leader è più semplice da analizzare rispetto a IDENTIFIER < IDENTIFIER
, che potrebbe essere interpretato come un'operazione inferiore? (E quindi, questa è semplicemente una cosa per rendere più semplice l'analisi del linguaggio? Ma se sì, perché non farlo anche durante le specifiche del tipo, in modo da avere i due specchi?)
(Come osserva Shepmaster, spesso Vec::new()
è sufficiente, il tipo può essere spesso dedotto.)
Non sono chiamati * modelli * in Rust; Penso che il tuo C++ stia mostrando. :-) Aneddoticamente, non ho mai visto quel particolare uso di specificare i parametri del tipo. Usando l'inferenza di tipo, puoi semplicemente dire 'Vec :: new()'.L'unica volta che ho visto specificare il tipo è per le funzioni che restituiscono un tratto e devi scegliere un tipo concreto, come 'parse' o' collect'. – Shepmaster
@Shepmaster: Ack, sono dei generici no? E sì, una certa quantità di inferenza di tipo può evitare di dover specificare il tipo effettivo; Penso di essermi imbattuto in questo principalmente come nuovo arrivato a Rust non ancora realizzando che l'inferenza di tipo può farlo, e mi chiedo ancora perché. – Thanatos
Penso che sia una buona domanda; Non mi ero neanche reso conto che potevi specificare i parametri del tipo in quella posizione! Attendo con ansia una risposta, ma la mia ipotesi è che si ridurrà alla semplicità dell'analisi, come hai suggerito. Volevo solo commentare per indicare che il tuo codice di esempio non era comune, sperando di aiutare altri nuovi arrivati a leggere questa domanda. Saluti! – Shepmaster