【发布时间】:2015-11-19 19:27:25
【问题描述】:
我正在尝试创建一个具有 BufWriter 的结构,该结构使用 Write 特征,以便该结构可以具有可以是任何实现该特征的缓冲写入器:File、Stream等。但是我的函数中存在一个问题,它创建的结构说我有mismatched types。这是一个具有相同问题的示例代码。
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 时使用它,它可以正常工作。
我觉得前者应该可以做到。
【问题讨论】:
-
为什么你认为第一种方法应该是可能的?
BufWriterStruct<W>返回值意味着调用者可以选择函数返回的内容,但这显然不是您的方法中发生的情况。 -
在我的实际情况中,我传递了另一个参数来告诉它要创建什么类型。就像它会传入一个字符串,如流、文件等,而新的会创建它。我只是想让 new 做所有事情(创建文件/流,做它需要做的任何事情,等等)。不过,我可以将文件/流的创建移到 new 之外。但越想越觉得自己想要的方式是不可能的。
标签: rust