Rust 具有泛型特征的结构,它也是泛型特征

Rust 具有泛型特征的结构,它也是泛型特征,rust,traits,Rust,Traits,在Rust 1.15中,我创建了一个特性来抽象过度读取和解析文件格式。我正在尝试创建一个结构,其中包含这个通用特性 我有一个特点: use std::io::Read; trait MyReader<R: Read> { fn new(R) -> Self; fn into_inner(self) -> R; fn get_next(&mut self) -> Option<u32>; fn do_thingi

在Rust 1.15中,我创建了一个特性来抽象过度读取和解析文件格式。我正在尝试创建一个结构,其中包含这个通用特性

我有一个特点:

use std::io::Read;

trait MyReader<R: Read> {
    fn new(R) -> Self;
    fn into_inner(self) -> R;

    fn get_next(&mut self) -> Option<u32>;
    fn do_thingie(&mut self);
}

如何创建my
MyIterThing
struct?

错误消息建议您使用标记,如。您可以这样做:

use std::marker::PhantomData;

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

这就不那么灵活了,因为每个
MyReader
的实现只能有一个
Source
选项,但这可能足够了,具体取决于您的需要。

您可能不需要类型参数,您需要关联的类型:

使用std::io::Read;
特征MyReader{
R型:读取;
fn新(Self::R)->Self;
fn进入_内部(self)->self::R;
fn get_next(&mut self)->选项;
fn do_thingie(&mut self);
}

好的,我道歉。在推送评论后立即注意到:你有没有按照建议制作一个
PhantomData
?@E_net4我真的不知道怎么做?谢谢-这里有一些有见地的链接。
use std::marker::PhantomData;

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

    fn new(Self::Source) -> Self;
    fn into_inner(self) -> Self::Source;

    fn get_next(&mut self) -> Option<u32>;
    fn do_thingie(&mut self);
}

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

trait MyReader {
    type R: Read;

    fn new(Self::R) -> Self;
    fn into_inner(self) -> Self::R;

    fn get_next(&mut self) -> Option<u32>;
    fn do_thingie(&mut self);
}

struct MyIterThing<'a, T>
    where T: MyReader + 'a
{
    inner: &'a mut T,
}

fn main() {}