Qualcuno implementa questo tratto per Vec<>
?
No.
E sorprendentemente, questa è una risposta corretta dimostrabile; il che è raro dal dimostrare che l'assenza di cose è solitamente difficile o impossibile. Quindi, come possiamo essere così sicuri?
Rust ha molto rigide regole di coerenza, il impl Trait for Struct
può essere fatto solo:
- sia nella stessa cassa come
Trait
- o nella stessa cassa come
Struct
e non altrove ; diamo try it:
impl<T> std::fmt::Display for Vec<T> {
fn fmt(&self, _: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
Ok(())
}
}
rendimenti:
error[E0210]: type parameter `T` must be used as the type parameter for some
local type (e.g. `MyStruct<T>`); only traits defined in the
current crate can be implemented for a type parameter
--> src/main.rs:1:1
|
1 | impl<T> std::fmt::Display for Vec<T> {
|^
Inoltre, per usare un trait
, ha bisogno di essere portata (e quindi, si ha bisogno di essere legato alla sua cassa), il che significa che:
- siete collegati sia con la cassa di
Display
e la cassa di Vec
- né implementare
Display
per Vec
e quindi ci porta a concludere che nessuno implementa Display
per Vec
.
Come un lavoro in giro, come indicato dalla Manishearth, è possibile utilizzare il Debug
tratto, che è richiamabile tramite "{:?}"
come di formato.
fonte
2015-05-19 08:29:24
L'errore E0210 significa che è consentito solo l'implementazione del tratto Display nel file collections/vec.rs? – highfly22
@ highfly22: la mia comprensione è che dovrebbe essere nella stessa cassa, non necessariamente lo stesso file. –
Cosa? Quindi non posso ad-hoc aggiungere un display trait impl nel modulo dove ne ho bisogno per un tipo in un'altra cassa? – BitTickler