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()
,来避免借用,或者只是检查字符串的长度。