使用rustc 1.0.0-nightly (d3732a12e 2015-02-06 23:30:17 +0000)
,我想在结构中存储一个&mut
并在整个结构生命周期中使用它,使用动态调度动态调用它。
最初的想法是存储Writer
引用,该引用可以是stdout或打开文件。
This is我想出了什么,但没有取得任何成功:
use std::old_io::Writer;
use std::old_io::stdio;
struct Container<'a> {
w: &'a mut Writer
}
let mut stdout = stdio::stdout();
let c = Container { w: &mut stdout };
// now it should be possible to make calls, like
c.w.write_u8(1);
代码因生命周期问题而失败,我无法表达w
只要Container
类型的实例存在。
另请注意,如果可能的话,我宁愿不使用堆,也不要使用盒装实例。
如何在Rust中实现上述功能?
答案 0 :(得分:1)
特征对象,当存储在结构中时,需要知道它可以存活多长时间; 'a
中的&'a mut
表示引用持续多长时间,但出于内存安全的原因,还必须考虑借用对象的生命周期。这是针对任意Writer + 'a
编写的'a
,在这种情况下可以与引用的'a
相同。最后的咒语有&'a mut (Writer + 'a)
:
use std::old_io::Writer;
use std::old_io::stdio;
struct Container<'a> {
w: &'a mut (Writer + 'a)
}
let mut stdout = stdio::stdout();
let c = Container { w: &mut stdout };
// now it should be possible to make calls, like
c.w.write_u8(1);
请记住可能的替代泛型:
use std::old_io::Writer;
use std::old_io::stdio;
struct Container<'a, W: Writer + 'a> {
w: &'a mut W
}
let mut stdout = stdio::stdout();
let c = Container { w: &mut stdout };
// now it should be possible to make calls, like
c.w.write_u8(1);
请注意,同样需要'a
对W
的约束。