Aqui está o exemplo:
fn bar<T>(v: &mut Vec<T>) {
bar(v); //reborrows
bar(v); //reborrows
}
que compila bem. Mas considere uma versão ligeiramente modificada:
fn foo<T>(v: &mut Vec<T>) {
let mut f = ||{
foo(v);
};
let mut g = ||{
foo(v);
};
f();
g();
}
O que temos aqui é um erro de compilação:
error[E0524]: two closures require unique access to `*v` at the same time
--> src/lib.rs:5:17
|
2 | let mut f = ||{
| -- first closure is constructed here
3 | foo(v);
| - first borrow occurs due to use of `*v` in closure
4 | };
5 | let mut g = ||{
| ^^ second closure is constructed here
6 | foo(v);
| - second borrow occurs due to use of `*v` in closure
7 | };
8 | f();
| - first borrow later used here
Acho que a mensagem de erro está relacionada a várias referências mutáveis ao mesmo tempo. Mas no primeiro exemplo também há múltiplas referências ao mesmo tempo. Isso é muito confuso.
No primeiro caso, cada reembolso é criado antes da chamada da função e destruído imediatamente a seguir, sem coexistir. Sim, possuem o mesmo escopo lexical , mas sem uso intercalado .
No segundo caso, porém, os novos empréstimos são criados quando os encerramentos são criados - esta ação não é adiada até a chamada, portanto a criação de
g
invalida o novo empréstimo capturado porf
e, portanto, invalidaf
a si mesmo.