is it possible to have the <'self> explained inside the tutorial?

-----
Gaetan



2013/12/4 Philippe Delrieu <[email protected]>

>  I reply to my questions. It can be helpful to somebody.
> First the error: wrong number of lifetime parameters
> The struct encoder is declared pub struct Encoder<'self> so the <'self>
> lifetime is part of the type and must be keep.
> The good declaration is pub fn
> buffer_encode<T:Encodable<Encoder<'self>>>(to_encode_object: &T) -> ~[u8]
>
> The call to the function is : Encoder::buffer_encode(&to_encode_object)
>
> For the other questions.
> The lifetime has been added to init (pub fn init<'a>(wr: &'a mut
> io::Writer) -> Encoder<'a>) because the borrowed specified parameter (wr)
> is returning in the Encoder and  must be keep borrower after the call and
> during all the Encoder use. Fn Init borrow the wr and give it to the
> Encoder. After the 'init' call, returned Encoder is use to encode object
> and wr must still be borrowed. The call to init and encode are put inside a
> scoped block to manage the Encoder lifetime:
> ex:
>
>         let mut m = MemWriter::new();
>         {
>             let mut encoder = Encoder::init(&mut m as &mut Writer);
>             to_encode_object.encode(&mut encoder);
>         }
>         m.inner()
>
> Why the type is declared with a <'self> lifetime (pub struct
> Encoder<'self>). It's not so clear. What I think, It's because the struct
> contains an attribute (priv wr: &'self mut io::Writer) that have a variable
> lifetime (depend on the use) , so to be configurable the lifetime must be
> declared as a generic in the struct. The variable lifetime is needed
> because, it allow the Encoder to borrow the writer during a lifetime longer
> that the function call (lifetime of normal borrowing) needed in the init
> function.
>
> For more informations:
> http://static.rust-lang.org/doc/master/tutorial-borrowed-ptr.html : to
> understand borrowing mechanism
> https://www.mail-archive.com/[email protected]/msg05811.html : for the
> <'self>
>
> Hope my explication is clear.
>
> I have remark about the list and the thread 'Rust Forum', I think it
> become important to have a user mailing list or forum. It's the second time
> I answer to my trivial questions and I fell that I'm annoying everybody
> with these.
>
> Philippe Delrieu
>
>
> Le 01/12/2013 18:28, Philippe Delrieu a écrit :
>
> I see the PR has been approved to I try to implements the method 'pub fn
> buffer_encode<T:Encodable<Encoder>>(to_encode_object: &T) -> ~[u8]'
> and I have this error : "error: wrong number of lifetime parameters:
> expected 1 but found 0" and  indicate the Encoder type.
>
> I have another question. I try to understand the modification on json.rsand 
> function declaration has changed from :
> impl serialize::Encoder for Encoder
> to:
> impl<'self> serialize::Encoder for Encoder<'self>
> or
> pub fn init<'a>(wr: &'a mut io::Writer) -> Encoder<'a>
> instead of
> pub fn new(wr: &mut io::Writer) -> Encoder
>
> Could you explain me the difference if you don't mind.
>
> Philippe
>
>
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
>
>
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to