【发布时间】:2018-05-29 06:37:51
【问题描述】:
有时我会重新分配参数绑定,因为不再需要原始绑定并且可能会导致混淆。处理这个问题的惯用方法是什么?例如:
fn foo(s: &str) {
let s = s.trim();
}
或
fn foo(mut s: &str) {
s = s.trim();
}
【问题讨论】:
标签: parameters rust idioms
有时我会重新分配参数绑定,因为不再需要原始绑定并且可能会导致混淆。处理这个问题的惯用方法是什么?例如:
fn foo(s: &str) {
let s = s.trim();
}
或
fn foo(mut s: &str) {
s = s.trim();
}
【问题讨论】:
标签: parameters rust idioms
第一个解决方案更好。在可能的情况下,不可变绑定总是比可变绑定更好。这就是为什么 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;
}
【讨论】: