Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何返回装箱的值?_Rust_Heap - Fatal编程技术网

Rust 如何返回装箱的值?

Rust 如何返回装箱的值?,rust,heap,Rust,Heap,我基本上有一个函数,可以创建一些需要在堆上分配的对象。我要做的是从该函数返回一个包含对该堆分配值的引用的结构 struct Cont<'a> { pub v: &'a i32 } impl<'a> Cont<'a> { fn new(v: &'a i32) -> Cont { Cont { v: v } } } fn f<'a>() ->

我基本上有一个函数,可以创建一些需要在堆上分配的对象。我要做的是从该函数返回一个包含对该堆分配值的引用的结构

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);
}
struct Cont{
fn新(v:&a i32)->续{
续{
v:v
}
}
}
fn f{
设v=Box::new(6);
续:新建(&v)
}
fn main(){
设c=f();
println!(“{}”,c.v);
}
我收到
错误:“v”的寿命不够长


您可以找到示例。

您不能返回仅包含借用的指向对象指针的结构,因为您的
框将在函数结束时被销毁

您需要将
框的所有权从函数中转移出去,以便堆分配的对象保持活动状态。最简单的方法是将
移动到结构中:

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);
}

如果我还想在
结构中使用引用,该怎么办?你的意思是,有时你想让结构只借用一个值,有时你想拥有该值?我不想借用。我可能会在函数中创建一些
&value
,然后创建并使用一些
Cont
,而不返回任何值或实际向下传递它们。因此,
&value
是有意义的,因为我不想在堆上分配它。有没有一种方法可以使用
Ref
?例如:在函数create
value
中,将
发送到
Cont
,让some
Cont
方法返回some
i32
,从该函数返回
i32
。我的答案中添加了另一个解决方案。
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);
}