If statement 与'if let'语句范围混淆

If statement 与'if let'语句范围混淆,if-statement,rust,borrow-checker,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行结束,这将释放不可变

为什么下面的代码不编译

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子句中仍借用字符串?

如果您不打算先使用
first\u five
(可能是愚蠢的假设),您可以使用
Some(
。is\u Some()
,来避免借用,或者只是检查字符串的长度。