如何正确创建一个堆分配的int并将其传递给另一个函数进行修改

问题描述 投票:0回答:1

我正在研究 Rust 最基本的概念,并对上一个问题有一个后续问题:为什么二元 + 运算符不能与两个 &mut int 一起使用?

我想在堆上创建一个

int
并将其传递给另一个函数进行修改。

我想出了这个:

fn increment(number: &mut Box<int>) {

    **number = **number + **number;

    println!("{}", number);
}

fn main() {
    let mut test = box 5;
    increment(&mut test);

    println!("{}", test);
}

此打印

10
10

这就是我想要的。

但是,

**
看起来很奇怪,我想我也可以写这种东西:

fn increment(number: &mut int) {

    *number = *number + *number;

    println!("{}", number);
}

fn main() {
    let mut test = box 5;
    increment(&mut* test);

    println!("{}", test);
}

关于我在堆上创建

int
并在另一个函数中修改它的意图,哪种方法是正确的(如果有)?对我来说,好像在第二个示例中,变量在传递给 increment 方法之前从堆移回堆栈,这不是我想要的。另一方面,第一个示例的
**
语法看起来很奇怪。 :-/
    

rust heap-memory stack-memory
1个回答
5
投票
Rust 教程

但是,在
owned_box

的情况下,不需要采取任何明确的操作。编译器会自动将框

box point
转换为像
&point
这样的引用。这是另一种形式的借贷。在这种情况下,所拥有的盒子中的内容将被借出。

所以你需要做的就是利用隐性借用:

fn increment(number: &mut int) { *number = *number + *number; } fn main() { let mut test = box 5; increment(test); println!("{}", test); }

我不认为 
test

的值被移回到这里的堆栈中。我怀疑从

Box
到借用引用的转换不会有任何运行时开销,但我对实现的了解还不够确定。

更新2023-08-13 Rust 1.70:上面的代码现在会产生编译错误:

错误:`box_syntax`已被删除

相反:

let mut test = Box::new(5);

© www.soinside.com 2019 - 2024. All rights reserved.