Как написать в Rust устойчивую к панике конструкцию, похожую на Java try { ... } finally { ... }, чтобы блоки try и finally могли каждый изменяемо заимствовать одно значение?
Мне нужно, чтобы заимствования блока try заканчивались сразу при выходе из него, как обычном, так и при раскрутке стека из-за паники, а заимствования блока finally начинались лишь при переходе к нему.
С scopeguard::defer! замыкание приходится объявлять перед аналогом блока try, и изменяемое заимствование начинается сразу при создании этого замыкания, поэтому код, соответствующий блоку try, уже не может изменяемо заимствовать то же значение, которое держит замыкание.
Переведено с английского·Показать оригиналWhat would be a way for me to write a panic-safe mecanism in Rust that behaves similarly to Java's try { ... } finally { ... }, where the try and finally blocks each mutably borrow the same value?
What I need is for a try block's borrows to finish as soon as control leaves it, whether by normal execution or panic unwinding, with the finally block borrowing only once control reaches it.
With scopeguard::defer!, the closure has to be declared before the equivalent try block, which starts the mutable borrow immediately upon creating that closure, which means the code corresponding to the try block cannot then take its own mutable borrow of the same thing already borrowed by that closure.