Cercando di implementare il tratto Debug
per un tipo personalizzato, mi sono imbattuto nell'implementazione di Vec<T>
. Ho difficoltà a capire come funziona.Informazioni sull'implementazione di debug per Vec <T>
L'implementazione è questa:
impl<T: fmt::Debug> fmt::Debug for Vec<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Debug::fmt(&**self, f)
}
}
ho capito che definisce l'implementazione fmt
per qualche altro tipo. Quello che non riesco a capire è di che tipo si tratta. Ho provato a capirlo con l'aiuto di another question e cercando tra implementations of Debug
per qualcosa che sembra appropriato (forse qualcosa come &[T]
), ma senza successo.
Qual è il significato esatto di &**self
in questo contesto? Quale implementazione di Debug
viene chiamata?
Grazie! Mi manca solo una cosa: ho trovato un'implementazione per '[T]' ma non per '& [T]', è quest'ultima a essere chiamata? Perché? – toro2k
@ toro2k Ho aggiunto un po 'di più a riguardo. Fatemi sapere se aiuta! – Shepmaster
Non penso ci sia alcun auto-dereferenziamento (o auto-referenziamento), perché 'fmt :: Debug :: fmt()' prende 'self' per riferimento, cioè si aspetta un' & [T] ', ed è dato un '& [T]'. –