rust 错误:未满足特性界限'someStruct< std::fs::File>:Write< std::fs::File>'

laawzig2  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(146)

我试图创建一个通用的 Package 器类型来简化分支逻辑,但是编译器抱怨没有为该函数中使用的特定类型实现Write特性。
这里没有描绘someFunction的逻辑,它需要内部类型执行一些特定于它自己的指令来完成它的任务。由于我不能在第三方结构体上实现一个特征来完成这一任务,所以我创建了一个 Package 器,这样我就可以实现一个新的特征,它将作为someFunction结束时的清理步骤。

pub struct someWrapper<T>
where T: Write
{
    inner: someInnerStuct<T>
}

impl<T: Write> someWrapper<T>
where T: Write
{
    fn flush(&mut self) -> io::Result<()> {
        self.inner.flush()
    }

    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
        self.inner.write(buf)
    }
}

fn buildStruct<T>(input: T) -> someWrapper<T>
where T: Write
{
    someWrapper{
        inner: someInnerStuct::new(input)
    }
}

fn someFunction<T: 'static>(
    func: fn(fs::File) -> T
) -> io::Result<()> 
where T: Write
{
    ...
}

fn main()
{
    someFunction(buildStruct);
}

我不知道如何解决这个问题,因为据我所知,任何实现Write的类型都满足了trait绑定。
实现Write特征明确地解决了问题,但却违背了使其通用的目的,不是吗?

6ljaweal

6ljaweal1#

你从来没有在someWrapper上实现过Write,你只是给T添加了边界,说someWrapper只能包含Write
最简单的实现是

impl<T> Write for someWrapper<T> where T: Write
{
    fn flush(&mut self) -> io::Result<()> {
        self.inner.flush()
    }

    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
        self.inner.write(buf)
    }
}

你几乎已经做到了。在impl块中,你将T绑定为Write两次。一次在<T: Write>中,一次在where子句中。只要一次就可以了。
此更改还需要将结构声明更改为

pub struct someWrapper<T> where T: Write
{
    inner: T
}

因为我不知道someInnerStuct是什么。
同样需要注意的是,您不需要在someWrapper的struct声明上使用bounds。

pub struct someWrapper<T>
{
    inner: T
}

Write的impl代码块仍然可以生成someWrapper: WriteifT: Write。但除此之外,它将允许您在someWrapper中插入任何内容。

相关问题