重新分配参数绑定的惯用方法是什么?

时间:2017-12-15 04:20:48

标签: parameters rust idiomatic

有时我会重新分配参数绑定,因为不再需要原始绑定,可能会导致混淆。处理这个问题的惯用方法是什么?例如:

fn foo(s: &str) {
    let s = s.trim();
}

fn foo(mut s: &str) {
    s = s.trim();
}

1 个答案:

答案 0 :(得分:6)

第一种解决方案更好。在可能的情况下,不可变绑定总是比可变绑定更好。这就是为什么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;
}