如何使用任意`& mut`引用成员和动态调度?

时间:2015-02-08 10:38:05

标签: rust

使用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中实现上述功能?

1 个答案:

答案 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);

请注意,同样需要'aW的约束。