如何创建一个“增量”函数,它接受整数指针并增加其值?

时间:2014-09-03 12:49:36

标签: pointers rust

this教程中,给出了以下代码:

fn increment(r: &mut int) {
    *r = *r + 1;
}

fn main () {
    let mut x = ~10;
    increment(x);
}

我知道这个语法已经过时了,所以我自己移植了代码:

fn increment(r: &mut i32) {
    *r = *r + 1;
}

fn main() {
    let mut x = Box::new(10);
    increment(x);
}

当我尝试编译时,出现以下错误:

error[E0308]: mismatched types
 --> src/main.rs:8:15
  |
8 |     increment(x);
  |               ^ expected &mut i32, found struct `std::boxed::Box`
  |
  = note: expected type `&mut i32`
             found type `std::boxed::Box<{integer}>`

我尝试了许多与&符号mut s等组合的组合。制作这种功能的正确方法是什么?

2 个答案:

答案 0 :(得分:6)

首先,您的教程已经过时了。有一个很棒的official book

其次,除非你真的需要,否则你不应该使用盒子。也就是说,不要写这个:

let mut x = Box::new(10);

写下这个:

let mut x = 10;

除非您确实知道您需要Box<i32>的原因。简而言之,需要三个方面的框:递归类型,特征对象和传递非常大结构。

第三,是的,作为A.B.说,你需要使用&mut引用:

let mut x = 10;
increment(&mut x);

此处无需取消引用,因为x不再是Box,它只是一个常规值。

答案 1 :(得分:1)

我试图让一个add_one()函数在Box<i32>上运行,最后让它像在这个例子中一样工作:

fn main() {
    let mut x = Box::new(5);

    println!("{:?}", x);
    println!("{:?}", *x);

    //  Taking a mutable reference to the dereference of x.
    add_one(&mut *x);

    println!("{:?}", x);

    boxed_add_one(&mut x);

    println!("{:?}", x);

}

// Gets a reference to a mutable int
fn add_one(num: &mut i32) {
    *num += 1;
}

// Gets a reference to a mutable box with int
fn boxed_add_one(b: &mut Box<i32>) {
    let ref mut num = **b;
    *num += 1;
}