我有一个方法,我想给一个 Box,它包含一个实现该std::io::Write
特征的结构。这是因为在我的程序中,我希望它写入标准输出,但在我的测试中,我希望它写入缓冲区并从该缓冲区生成一个字符串来验证我的程序。
我在我的程序中做了这样的事情:
let stdOutWriter = Box::new(io::stdout());
write_output(&mut results, stdOutWriter);
Run Code Online (Sandbox Code Playgroud)
其中 write_output 调用:
let mut wtr = csv::Writer::from_writer(writer);
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我想调用:
let writer = Box::new(io::BufWriter::new(Vec::new()));
write_output(&mut results, writer).unwrap();
let bytes = Box::new(writer.into_inner().unwrap());
// I plan to validate this string later
let string = String::from_utf8(*bytes).unwrap();
Run Code Online (Sandbox Code Playgroud)
问题是 write_output 消耗了 writer,所以我无法调用 writer.into_inner()。所以我尝试将其更改为参考:
let mut writer = Box::new(io::BufWriter::new(Vec::new()));
write_output(&mut results, &mut writer).unwrap();
Run Code Online (Sandbox Code Playgroud)
现在我得到:
不匹配的类型预期可变引用
&mut Box<(dyn std::io::Write + 'static)>
发现可变引用&mut Box<BufWriter<Vec<u8>>>
我该如何解决这些问题?
编辑:
write_output 的签名是:
fn write_output(results: &HashMap<u16, ResultRecord>,writer: &mut Box<dyn io::Write>) -> …
Run Code Online (Sandbox Code Playgroud)