Rust 如何对不可变值进行可变引用
我刚刚开始学习一点,对变量的易变性的概念非常感兴趣 我试图写一些与这个C++程序非常相似的东西。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
#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++吗?