与`if let`语句范围

时间:2018-05-02 04:03:42

标签: if-statement rust borrow-checker

为什么以下代码无法编译?

fn main() {
    let mut s = "test".to_string();

    if let Some(first_five) = s.get(..5) {
        // ...
    }
    else {
        s.push('s');
    }
}

我得到的错误是不可变借款发生在第4行(s.get(..5)),而不可变借款在第9行结束。为什么它在第9行结束?似乎s.get(..5)的范围应该在第6行结束,这将释放不可变引用,允许在第8行(s.push('s'))获取可变引用。

以下代码是一种解决方法,但它不是非常惯用,也不是我想要使用的东西。

fn main() {
    let mut s = "test".to_string();

    let mut flag = false;
    if let Some(first_five) = s.get(..5) {
        //  ...
    }
    else {
        flag = true;
    }

    if flag {
        s.push('s');
    }
}

重申一下,是否有理由s借用的时间比需要的时间长得多? s.get(..5)的返回值超出了范围,并且从else子句中无法访问,那么为什么字符串仍然在else子句中被借用?

0 个答案:

没有答案