这是我正在做的简化示例:
struct Foo ...
impl io::Read for Foo ...
fn problem<'a>() -> io::Result<&'a mut io::Read> {
// foo does not live long enough, because it gets allocated on the stack
let mut foo = Foo{ v: 42 };
Ok(&mut foo)
}
Run Code Online (Sandbox Code Playgroud)
Rust操场就在这里.
显然,问题是foo在堆栈上分配,所以如果我们返回对它的引用,引用会比对象更长.
在C中,您可以通过使用malloc在堆上分配对象来解决此问题,并且调用者需要知道free在适当时调用.在GCed语言中,这只会起作用,因为它foo会一直存在,直到没有引用它为止.Rust非常聪明,介于两者之间,所以我不确定我的选择是什么.
我认为一个选项是返回托管指针类型.是Box最合适的?(我找到了生锈指针的指南,但它已经过时了.)
我返回引用的原因是,实际上我需要返回实现的几个结构中的任何一个Read.我想另一种选择是创建一个枚举来包装每个可能的结构.这样可以避免堆分配,但似乎不必要的尴尬.
还有其他我没有想过的选择吗?
用Box 编译成功替换引用:
fn problem<'a>() -> io::Result<Box<io::Read>> {
let mut foo = Foo{ v: 42 };
Ok(Box::new(foo))
}
Run Code Online (Sandbox Code Playgroud)