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

Rust 如何对不可变值进行可变引用,rust,pass-by-reference,mutable,Rust,Pass By Reference,Mutable,我刚刚开始学习一点,对变量的易变性的概念非常感兴趣 我试图写一些与这个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 a

我刚刚开始学习一点,对变量的易变性的概念非常感兴趣

我试图写一些与这个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;
}
然而,由于不匹配的易变性,我得到了错误

错误:不匹配的类型:

预期的
&mut i32
, 找到
&i32

(值的可变性不同)[E0308]


有没有办法在不使用
::New
的情况下将此通过引用样式固定在Rust中?我猜我可以使用
.clone()
,但我不是肯定的。

你误解了代码的作用。以下是实际等效代码:

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;
}

b
在您的C代码中不是任何形式的引用;它与
a
完全没有联系。只是C允许你传递一个值,并让它推断它必须引用它,而Rust对于这类事情是非常明确的,因此你需要编写
&mutb
,而不仅仅是
b
,来传递一个对
dou something
的可变引用。前面的
mut b
只会使
b
插槽可变,允许您更改其中的值(没有它,您将无法创建对
b
的可变引用)。

您误解了代码的作用。以下是实际等效代码:

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;
}
b
在您的C代码中不是任何形式的引用;它与
a
完全没有联系。只是C允许你传递一个值,并让它推断它必须引用它,而Rust对于这类事情是非常明确的,因此你需要编写
&mutb
,而不仅仅是
b
,来传递一个对
dou something
的可变引用。前面的
mut b
只是使
b
插槽可变,允许您对其中的值进行变异(没有它,您将无法创建对
b
的可变引用)。

上次我检查时。你确定你没有使用C++编译器,把你的代码当作C++来处理吗?您确定您没有使用C++编译器并将代码视为C++吗?