如何对不可变值进行可变引用
How to make a mutable reference to an immutable value
我刚开始学习一点 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;
}
我希望看到:
a is 3 and b is 3
a is 3 and b is 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;
}
但是,由于不匹配的可变性,我遇到了错误。
error: mismatched types:
expected &mut i32
,
found &i32
(values differ in mutability) [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 对这些事情非常明确,所以你需要写 &mut b
而不仅仅是 b
将可变引用传递给 do_something
。前面的 mut b
只是使 b
插槽可变,允许您改变其中的值(没有它,您将无法创建对 b
的可变引用)。
我刚开始学习一点 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;
}
我希望看到:
a is 3 and b is 3
a is 3 and b is 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;
}
但是,由于不匹配的可变性,我遇到了错误。
error: mismatched types:
expected
&mut i32
, found&i32
(values differ in mutability) [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 对这些事情非常明确,所以你需要写 &mut b
而不仅仅是 b
将可变引用传递给 do_something
。前面的 mut b
只是使 b
插槽可变,允许您改变其中的值(没有它,您将无法创建对 b
的可变引用)。