Почему следующий код не компилируется?
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_five
(возможно, глупое предположение), вы можете избежать заимствования сSome(_)
,.is_some()
или просто проверить длину строки.