我基本上有一个函数可以创建一些需要在堆上分配的对象。我想要做的是从该函数返回一个包含对该堆分配值的引用的结构。
struct Cont<'a> {
pub v: &'a i32
}
impl<'a> Cont<'a> {
fn new(v: &'a i32) -> Cont {
Cont {
v: v
}
}
}
fn f<'a>() -> Cont<'a> {
let v = Box::new(6);
Cont::new(&v)
}
fn main() {
let c = f();
println!("{}", c.v);
}
我收到错误:'v' does not live long enough
。
您可以找到示例 here .
最佳答案
您不能返回仅包含指向您的对象的借用指针的结构,因为您的 Box
将在函数结束时被销毁。
您需要将 Box
的所有权转移到函数之外,以便堆分配的对象保持事件状态。最简单的方法是将 Box
移动到您的结构中:
struct Cont {
pub v: Box<i32>
}
impl Cont {
fn new(v: Box<i32>) -> Cont {
Cont {
v: v
}
}
}
fn f() -> Cont {
let v = Box::new(6);
Cont::new(v)
}
fn main() {
let c = f();
println!("{}", c.v);
}
如果您想要一个能够存储借用指针或拥有的Box
(或其他类型的智能指针)的结构,我们可以使它在Borrow
上通用。特质。
use std::borrow::Borrow;
struct Cont<T> where T: Borrow<i32> {
pub v: T
}
impl<T> Cont<T> where T: Borrow<i32> {
fn new(v: T) -> Cont<T> {
Cont {
v: v
}
}
}
fn owned() -> Cont<Box<i32>> {
let v = Box::new(6);
Cont::new(v)
}
fn borrowed(v: &i32) -> Cont<&i32> {
Cont::new(v)
}
fn main() {
let c = owned();
println!("{}", c.v);
let x = 123;
let c = borrowed(&x);
println!("{}", c.v);
}
关于rust - 我怎样才能退回盒装值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341523/