【发布时间】:2019-04-20 08:18:15
【问题描述】:
我想在结构中的Option 中存储对io::Write 特征对象的引用,但我不知道如何。我可以像这样直接把引用放进去:
pub struct Parameters<'a> {
pub log: &'a (io::Write + 'a),
// Other elements removed
}
然后从(例如)BufWriter 分配它,如下所示:
let logstream = &BufWriter::new(f);
let parameters = Parameters {
log: logstream, // Other elements removed
};
这可行,但我希望 logstream 是可选的。如果我尝试:
pub struct Parameters<'a> {
pub log: Option<&'a(io::Write + 'a)>,
// Other elements removed
}
和
let logstream = match f {
Some(f) => Some(&BufWriter::new(f)),
None => None,
};
let parameters = Parameters {
log: logstream,
// Other elements removed
};
我明白了:
error[E0308]: mismatched types
--> src/main.rs:17:14
|
17 | log: logstream,
| ^^^^^^^^^ expected trait std::io::Write, found struct `std::io::BufWriter`
|
= note: expected type `std::option::Option<&dyn std::io::Write>`
found type `std::option::Option<&std::io::BufWriter<std::vec::Vec<u8>>>`
这里有什么合适的方法?
【问题讨论】:
-
一旦你通过类型检查器,借用检查器就会杀死你(
BufWriter活得不够长)。
标签: rust traits trait-objects