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

时间:2014-05-28 22:06:18

标签: stack heap rust

我正在玩最基本的Rust概念,并对我之前的问题提出了跟进问题:Why does the binary + operator not work with two &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方法,这不是我想要的。另一方面,第一个示例的**语法看起来很奇怪。 : - /

1 个答案:

答案 0 :(得分:4)

你就在那里。来自Rust tutorial

  

但是,在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到借用参考的转换不会产生任何运行时开销,但我对实现的了解不够充分。