我试图创建一个通用的 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特征明确地解决了问题,但却违背了使其通用的目的,不是吗?
1条答案
按热度按时间6ljaweal1#
你从来没有在
someWrapper
上实现过Write
,你只是给T
添加了边界,说someWrapper
只能包含Write
。最简单的实现是
你几乎已经做到了。在impl块中,你将
T
绑定为Write
两次。一次在<T: Write>
中,一次在where
子句中。只要一次就可以了。此更改还需要将结构声明更改为
因为我不知道
someInnerStuct
是什么。同样需要注意的是,您不需要在
someWrapper
的struct声明上使用bounds。Write
的impl代码块仍然可以生成someWrapper: Write
ifT: Write
。但除此之外,它将允许您在someWrapper
中插入任何内容。