reference - Understanding the Debug implementation for Vec<T> -


trying implement debug trait custom type stumbled upon implementation vec<t>. have difficulties understanding how works.

the implementation goes this:

impl<t: fmt::debug> fmt::debug vec<t> {     fn fmt(&self, f: &mut fmt::formatter) -> fmt::result {         fmt::debug::fmt(&**self, f)     } } 

i understand calls fmt implementation other type. cannot understand type is. i've tried figure out of another question, , searching among implementations of debug looks appropriate (maybe &[t]), no success.

what exact meaning of &**self in context? implementation of debug being called?

in cases this, find useful make compiler tell type is. cause type error , let compiler diagnostics you. easiest way try assign item of type ():

fn main() {     let v = &vec![1,2,3];     let () = v;     let () = &**v; } 

the errors are:

<anon>:3:9: 3:11 error: mismatched types:  expected `&collections::vec::vec<_>`,     found `()` (expected &-ptr,     found ()) [e0308] <anon>:3     let () = v;                  ^~ <anon>:4:9: 4:11 error: mismatched types:  expected `&[_]`,     found `()` (expected &-ptr,     found ()) [e0308] <anon>:4     let () = &**v;                  ^~ 

thus v &collections::vec::vec<_> , &**v &[_].

more detailed, vec has this:

impl<t> deref vec<t> {     type target = [t];     // ... } 

so, dereference once go &vec<t> vec<t>, dereference again [t], , reference once &[t].

[t] has this:

impl<t> debug [t] {     fn fmt(&self, ...) ...; } 

however, when searching appropriate method call, rust automatically attempt dereference target. means can find method on [t] &[t].

as corrected francis gagné, debug::fmt takes &self, directly calling &[t] finds matching implementation. no need automatic referencing or dereferencing.


Comments

Popular posts from this blog

c++ - Difference between pre and post decrement in recursive function argument -

php - Nothing but 'run(); ' when browsing to my local project, how do I fix this? -

php - How can I echo out this array? -