Struct with a generic trait which is also a generic trait

前端 未结 2 757
伪装坚强ぢ
伪装坚强ぢ 2021-01-20 20:57

In Rust 1.15, I have created a trait to abstract over reading & parsing file format(s). I\'m trying to create a struct which has this generic trait inside.

I hav

2条回答
  •  盖世英雄少女心
    2021-01-20 21:32

    The error message gives you a suggestion to use a marker, like PhantomData. You can do it like this:

    use std::marker::PhantomData;
    
    struct MyIterThing<'a, R: Read, T: MyReader + 'a> {
        inner: &'a mut T,
        marker: PhantomData,
    }
    

    Instances of PhantomData have zero runtime cost, so it's better to use that than to just create a field of type R.


    Another solution would be to use an associated type instead of a type parameter:

    trait MyReader {
        type Source: Read;
    
        fn new(Self::Source) -> Self;
        fn into_inner(self) -> Self::Source;
    
        fn get_next(&mut self) -> Option;
        fn do_thingie(&mut self);
    }
    
    struct MyIterThing<'a, T: MyReader + 'a> {
        inner: &'a mut T,
    }
    

    This is a little less flexible as there can only be one choice of Source per implementation of MyReader, but it could be sufficient, depending on your needs.

提交回复
热议问题