如何对不可变值进行可变引用

eri*_*rip 1 mutable pass-by-reference rust

我刚刚开始学习一点Rust,并且对变量的可变性概念非常感兴趣.

我正在尝试编写与此C++程序非常相似的内容.

#include <cstdio>

void do_something(int &var) {
   var++;
}

int main() {

    int a = 3;
    int b = a;
    printf("a is %d and b is %d\n", a, b);
    do_something(b);
    printf("a is %d and b is %d\n", a, b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望看到:

a是3,b是3

a是3,b是4

这个想法是传递引用呈现b可变,但a不可变.

以下是我假设在Rust中编写此程序的方法:

fn main() {
    let a: i32 = 3;
    let b: &mut i32 = &a;

    println!("a is {} and b is {}", a, b);
    do_something(b);
    println!("a is {} and b is {}", a, b);
}

fn do_something(var: &mut i32) {
    (*var)+=1;
}
Run Code Online (Sandbox Code Playgroud)

但是,由于可变性不匹配,我收到错误.

错误:类型不匹配:

预期&mut i32,发现&i32

(值可变性不同)[E0308]

有没有办法在Rust中保证这种传递参考样式::New?我的猜测是我可以使用.clone(),但我并不积极.

Chr*_*gan 7

你误解了代码的作用.这是实际的等效代码:

fn main() {
    let a: i32 = 3;
    let mut b = a;

    println!("a is {} and b is {}", a, b);
    do_something(&mut b);
    println!("a is {} and b is {}", a, b);
}

fn do_something(var: &mut i32) {
    *var += 1;
}
Run Code Online (Sandbox Code Playgroud)

b在您的C代码中,不是任何形式的引用; 它绝对没有任何联系a.只是C允许你传递一个值并让它推断它必须引用它,而Rust对这些事情非常明确,所以你需要编写&mut b而不仅仅是b传递一个可变引用do_something.在mut b上只是使早期b插槽可变的,可以让你里面发生变异它的价值(如果没有它,你将无法创建一个可变引用b).