我正在尝试创建一个结构,它有一个使用 Write
特性的 BufWriter
,这样这个结构就可以有一个缓冲的 writer,它可以是任何实现该特征:File
、Stream
等。但是我的函数中存在一个问题,它创建的结构说我有不匹配的类型
.这是具有相同问题的示例代码。
use std::fs::File;
use std::io::{BufWriter, Write};
pub struct BufWriterStruct<W: Write> {
pub writer: Option<BufWriter<W>>,
}
impl <W: Write>BufWriterStruct<W> {
pub fn new(filename: &str) -> BufWriterStruct<W> {
BufWriterStruct {
writer: Some(BufWriter::new(File::create(filename).unwrap())),
}
}
}
fn main() {
let tmp = BufWriterStruct::new("tmp.txt");
}
错误
error: mismatched types:
expected `BufWriterStruct<W>`,
found `BufWriterStruct<std::fs::File>`
如果我改为更改我的 new
函数,取而代之的是采用实现 Write
特性的参数,并在创建 BufWriter
时使用它,它就可以工作很好。
我觉得前者应该可以以某种方式实现。
最佳答案
您的错误在于混淆了通用和特定:
impl <W: Write>BufWriterStruct<W> {
pub fn new(filename: &str) -> BufWriterStruct<W> {
BufWriterStruct {
writer: Some(BufWriter::new(File::create(filename).unwrap())),
}
}
}
在这里,您的 BufWriter
实例应该接受 W: Write
,这由 调用者 决定,但该函数实际上创建了一个文件
。
让调用者决定:
impl <W: Write> BufWriterStruct<W> {
pub fn new(writer: W) -> BufWriterStruct<W> {
BufWriterStruct {
writer: Some(BufWriter::new(writer)),
}
}
}
当然,这会稍微改变调用:
fn main() {
let tmp = BufWriterStruct::new(File::create("tmp.txt").unwrap());
}
然后 it'll work .
关于rust - 为字段创建具有通用特征的结构。预期的 struct<trait> 找到了 struct<type that implements said trait>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812706/