如何将 Box 值传递给函数

Djv*_*jvu 2 rust

如果我有以下方法:

fn borrow_func(c: Box<i32>) {
    // some code
}

fn main(){
    let a = Box::new(5i32);
    let b = a;

    borrow_func(b);
    println!("b contains: {}", b);
}
Run Code Online (Sandbox Code Playgroud)

因为堆中的资源会在borrow_func 中释放,有没有办法避免这种情况?

如果我尝试在borrow_func中使用借用,如下所示,我会得到一个

编译错误:

预期Box<i32>
发现&_

fn borrow_func(&c: Box<i32>) {
}
Run Code Online (Sandbox Code Playgroud)

似乎编译器没有b的指针类型?

我怎样才能使这项工作?

Tib*_*nke 7

borrow_func实际上拥有对盒装变量的所有权。您应该更改 的签名borrow_func以反映借用情况,如下所示:

fn borrow_func(c: &i32) {
    // some code
}

fn borrow_func2(c: &Box<i32>) {
    // some code
}

fn main(){
    let a = Box::new(5i32);
    let b = a;

    borrow_func(&b);
    borrow_func2(&b);
    println!("b contains: {}", b);
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用 &Box 的简单引用。有关借阅的更多信息,请查看:https : //doc.rust-lang.org/book/references-and-borrowing.html

弗拉基米尔补充了一条有用的信息:

指向像 &Box 这样的盒子的指针是单一的并且完全没有意义——它们引入了不必要的双重间接并且没有任何有用的回报。只是简单的参考(&i32)总是要走的路。

  • 我想补充一点,像 `&amp;Box&lt;i32&gt;` 这样的盒子的指针是单调的,完全没有意义——它们引入了不必要的双重间接,并且没有任何有用的回报。只是简单的引用(`&amp;i32`)总是要走的路。 (6认同)