我想創建一個結構具有BufWriter
,使用Write
特質,以便此結構可以有一個緩衝作家,可以是任何實現該特質: File
,Stream
等。但我在我的函數有一個問題,創建結構說,我有mismatched types
。以下是一個具有相同問題的示例代碼。用字段的通用特徵創建結構。預期的結構<trait>找到結構<類型,實現所說的特質>
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'返回值意味着調用者可以選擇函數返回的內容,但這顯然不是你的方法中發生的事情。 –
fjh
那麼在我的實際案例中,我傳遞了另一個參數來告訴它要創建什麼類型。就像它會傳遞一個像流,文件等字符串一樣,新的會創建它。 我只是想新的做一切(創建文件/流,做任何需要的內容等)。 我可以只是移動新的文件/流的創建。 但我越想到它,我不認爲我想這樣做的方式是可能的。 –