小编jac*_*cob的帖子

如何避免使用 Box 进行移动?

我有一个方法,我想给一个 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)

traits rust

0
推荐指数
1
解决办法
297
查看次数

标签 统计

rust ×1

traits ×1