为什么以下代码无法编译?
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子句中被借用?