重新分配参数绑定的惯用方法是什么?
What is the idiomatic way to reassign parameter bindings?
有时我会重新分配参数绑定,因为不再需要原始绑定并且可能会导致混淆。处理这个问题的惯用方法是什么?例如:
fn foo(s: &str) {
let s = s.trim();
}
或
fn foo(mut s: &str) {
s = s.trim();
}
第一种方案更好。在可能的情况下,不可变绑定总是优于可变绑定。这就是为什么 Rust 的绑定在默认情况下是不可变的,以及为什么你必须输入一个额外的关键字才能像大多数过程语言一样拥有一个变量。
当您使用可变变量时,您可能会不小心更改值:
fn foo(mut i1: u32) {
i1 = i1.count_ones();
let mut i2 = 0_u32;
// Some lines
i1 = 42; // Oops, I wrote `i1` instead of `i2`
}
如果您使用不可变版本,则不会发生这种情况:
fn foo(i1: u32) {
let i1 = i1.count_ones();
let mut i2 = 0_u32;
// Some lines
i1 = 42; // error[E0384]: re-assignment of immutable variable `i1`
}
仅当您必须将可变变量提供给另一个作用域以进行修改时才需要使用可变变量:
fn main() {
let mut to_be_modified = 123;
{
// do something in another scope
to_be_modified = 456;
}
// in another function
foo(&mut to_be_modified);
}
fn foo(i: &mut i32) {
*i = 789;
}
有时我会重新分配参数绑定,因为不再需要原始绑定并且可能会导致混淆。处理这个问题的惯用方法是什么?例如:
fn foo(s: &str) {
let s = s.trim();
}
或
fn foo(mut s: &str) {
s = s.trim();
}
第一种方案更好。在可能的情况下,不可变绑定总是优于可变绑定。这就是为什么 Rust 的绑定在默认情况下是不可变的,以及为什么你必须输入一个额外的关键字才能像大多数过程语言一样拥有一个变量。
当您使用可变变量时,您可能会不小心更改值:
fn foo(mut i1: u32) {
i1 = i1.count_ones();
let mut i2 = 0_u32;
// Some lines
i1 = 42; // Oops, I wrote `i1` instead of `i2`
}
如果您使用不可变版本,则不会发生这种情况:
fn foo(i1: u32) {
let i1 = i1.count_ones();
let mut i2 = 0_u32;
// Some lines
i1 = 42; // error[E0384]: re-assignment of immutable variable `i1`
}
仅当您必须将可变变量提供给另一个作用域以进行修改时才需要使用可变变量:
fn main() {
let mut to_be_modified = 123;
{
// do something in another scope
to_be_modified = 456;
}
// in another function
foo(&mut to_be_modified);
}
fn foo(i: &mut i32) {
*i = 789;
}