Whoops, excluded the mailing list.

On 22 March 2014 11:53, Edward Wang <edward.yu.w...@gmail.com> wrote:

> `to_encode_object` has type `Encodable<Encoder<'a>>` so 
> `to_encode_object.encode(...)`
> requires an Encoder instance with lifetime 'a, the one defined in the
> struct bound.
>
> The problem I think is that I can't write:
>
>     pub fn buffer_encode<T:Encodable<_>>(to_encode_object: &T) -> ~[u8]  {
>
>         let mut m = MemWriter::new();
>         {
>             let mut encoder = Encoder::new(&mut m as &mut io::Writer);
>             to_encode_object.encode(&mut encoder);
>         }
>         m.unwrap()
>     }
>
> and ask rustc to infer a proper type parameter. That would be global
> inference.
>
> -Ed
>
>
> On Sat, Mar 22, 2014 at 11:43 PM, Josh Matthews <j...@joshmatthews.net>wrote:
>
>> "m here is merely a local variable but Encoder<'a> requires a lifetime at
>> least 'a"
>>
>> This statement does not make sense to me. Why does m's lifetime not
>> satisfy the requirement?
>>
>> Cheers,
>> Josh
>>
>>
>> On 22 March 2014 10:24, Edward Wang <edward.yu.w...@gmail.com> wrote:
>>
>>> Hi,
>>>
>>> I'm in the process of fixing a `ty_trait` variance inference bug, which
>>> will void the following code in json.rs:
>>>
>>> pub struct Encoder<'a> {
>>>     priv wr: &'a mut io::Writer,
>>>     priv error: io::IoResult<()>,
>>> }
>>> impl<'a> Encoder<'a> {
>>>     pub fn new<'a>(wr: &'a mut io::Writer) -> Encoder<'a> {
>>>         Encoder { wr: wr, error: Ok(()) }
>>>     }
>>>
>>>     pub fn buffer_encode<T:Encodable<Encoder<'a>>>(to_encode_object: &T)
>>> -> ~[u8]  {
>>>         let mut m = MemWriter::new();
>>>         {
>>>             let mut encoder = Encoder::new(&mut m as &mut io::Writer);
>>>             to_encode_object.encode(&mut encoder);
>>>         }
>>>         m.unwrap()
>>>     }
>>> }
>>>
>>> If taking a close look, m here is merely a local variable but
>>> Encoder<'a> requires a lifetime at least 'a. A naive fix would be:
>>>
>>> let mut encoder = Encoder::new(cast::transmute_mut_region(&mut m));
>>>
>>> But of course, it is very uncivilized :) Any suggestion on how to
>>> refactor this piece of code so it won't violate the lifetime requirement?
>>>
>>> Regards,
>>> Edward
>>>
>>> _______________________________________________
>>> Rust-dev mailing list
>>> Rust-dev@mozilla.org
>>> https://mail.mozilla.org/listinfo/rust-dev
>>>
>>>
>>
>
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to