<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mirko Donnarumma</title>
    <description>The latest articles on DEV Community by Mirko Donnarumma (@mirkodonnarumma-rs).</description>
    <link>https://dev.to/mirkodonnarumma-rs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2478370%2F607d4d1e-2d4f-468c-85a8-7a7837801ca1.png</url>
      <title>DEV Community: Mirko Donnarumma</title>
      <link>https://dev.to/mirkodonnarumma-rs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mirkodonnarumma-rs"/>
    <language>en</language>
    <item>
      <title>Come il borrow checker determina la durata dei `&amp;mut`</title>
      <dc:creator>Mirko Donnarumma</dc:creator>
      <pubDate>Thu, 15 Jan 2026 19:54:04 +0000</pubDate>
      <link>https://dev.to/mirkodonnarumma-rs/come-il-borrow-checker-determina-la-durata-dei-mut-27pf</link>
      <guid>https://dev.to/mirkodonnarumma-rs/come-il-borrow-checker-determina-la-durata-dei-mut-27pf</guid>
      <description>&lt;h2&gt;
  
  
  Introduzione
&lt;/h2&gt;

&lt;p&gt;In questo articolo analizzeremo come il borrow checker di Rust determina la durata effettiva di un prestito mutabile (&lt;code&gt;&amp;amp;mut&lt;/code&gt;) in presenza delle &lt;em&gt;Non-Lexical Lifetimes&lt;/em&gt; (NLL).&lt;br&gt;
In particolare, analizzeremo perché la durata di un prestito non coincide con la sua durata lessicale e perché chiamate esplicite a &lt;code&gt;drop()&lt;/code&gt; &lt;strong&gt;non&lt;/strong&gt; permettono di forzare manualmente la fine di un prestito quando esistono usi successivi nel flusso di controllo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Problema tecnico
&lt;/h2&gt;

&lt;p&gt;Durante lo studio del capitolo "4.1 - What is Ownership" del &lt;a href="https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html" rel="noopener noreferrer"&gt;Rust Book&lt;/a&gt; assieme allo svolgimento dell'esercizio &lt;code&gt;06_move_semantics/move_semantics4.rs&lt;/code&gt; dei &lt;a href="https://rustlings.rust-lang.org/" rel="noopener noreferrer"&gt;Rustlings&lt;/a&gt;, un programma apparentemente semplice che cerca di creare due prestiti mutabili consecutivi su &lt;code&gt;x&lt;/code&gt; fallisce con un errore preciso, il &lt;code&gt;E0499&lt;/code&gt; che, se chiediamo al compilatore, ci darà questa spiegazione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;borrowed&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;mutable&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;than&lt;/span&gt; &lt;span class="n"&gt;once&lt;/span&gt;&lt;span class="py"&gt;.

Erroneous&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// error: cannot borrow `i` as mutable more than once at a time&lt;/span&gt;

&lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="n"&gt;note&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Rust&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;either&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;many&lt;/span&gt; &lt;span class="n"&gt;immutable&lt;/span&gt; &lt;span class="n"&gt;references&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="n"&gt;mutable&lt;/span&gt; &lt;span class="n"&gt;reference&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il codice incriminato è il seguente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[cfg(test)]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO: Fix the compiler errors only by reordering the lines in the test.&lt;/span&gt;
    &lt;span class="c1"&gt;// Don't add, change or remove any line.&lt;/span&gt;
    &lt;span class="nd"&gt;#[test]&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;move_semantics4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Come possiamo vedere, viene tentato un secondo &lt;code&gt;&amp;amp;mut x&lt;/code&gt; mentre il primo è ancora (secondariamente) necessario.&lt;br&gt;
Le regole della proprietà in Rust &lt;strong&gt;impongono di avere una sola referenza mutabile (&lt;code&gt;&amp;amp;mut&lt;/code&gt;) attiva su un valore alla volta&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La correzione dell'esercizio è quindi molto semplice e diretta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[cfg(test)]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[test]&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;move_semantics4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vediamo assieme perché funziona:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;let y = &amp;amp;mut x;&lt;/code&gt; -  Il compilatore registra: &lt;em&gt;esiste un prestito mutabile attivo di &lt;code&gt;x&lt;/code&gt; chiamato &lt;code&gt;y&lt;/code&gt;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;y.push(42);&lt;/code&gt; -  "Muovo" il valore, questo è &lt;strong&gt;l’ultimo uso&lt;/strong&gt; di &lt;code&gt;y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dopo questa riga, per il compilatore:

&lt;ul&gt;
&lt;li&gt;non esistono più prestiti mutabili attivi su &lt;code&gt;x&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;quindi &lt;code&gt;let z = &amp;amp;mut x;&lt;/code&gt; diventa valido&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Non ero a conoscenza però di una feature particolare del compilatore di Rust, che consente proprio quanto abbiamo appena visto: le &lt;em&gt;NLL: Non-Lexical Lifetimes&lt;/em&gt;.&lt;br&gt;
Tramite le &lt;em&gt;non-lexical lifetimes&lt;/em&gt; (NLL) il prestito mutabile termina &lt;strong&gt;al termine dell’ultimo uso&lt;/strong&gt;, non necessariamente alla fine del blocco; questo sarà molto importante per l'esempio che vedremo a breve&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per mezzo delle Non-Lexical Lifetimes (NLL)&lt;/strong&gt; il compilatore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;determina che &lt;code&gt;y&lt;/code&gt; &lt;strong&gt;non verrà più usato&lt;/strong&gt; dopo &lt;code&gt;y.push(42)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;conclude che il &lt;em&gt;lifetime&lt;/em&gt; del prestito mutabile di &lt;code&gt;y&lt;/code&gt; &lt;strong&gt;termina esattamente qui&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Domanda&lt;/strong&gt;: Esiste un modo per dichiarare esplicitamente un lifetime a &lt;code&gt;y&lt;/code&gt; affinché il compilatore non utilizzi le NLL ma sia io tramite il codice a dirgli fin quando dura &lt;code&gt;y&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risposta&lt;/strong&gt;: &lt;strong&gt;non si può dichiarare un lifetime esplicito su una variabile locale&lt;/strong&gt; per forzare il borrow checker a ignorare le NLL.&lt;br&gt;
I parametri del &lt;em&gt;lifetime&lt;/em&gt; servono per firmare tipi/funzioni/strutture, non per controllare direttamente la durata lessicale di un binding dentro una funzione.&lt;/p&gt;

&lt;p&gt;Pensando mi viene in mente che per controllare esplicitamente &lt;em&gt;quando&lt;/em&gt; un prestito termina, conosco la funzione &lt;code&gt;drop()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Allora penso.. Quindi se lo droppo, allora se provo ad invocarlo dopo &lt;code&gt;let z = &amp;amp;mut x;&lt;/code&gt; non dovrebbe più darmi l'errore &lt;code&gt;E0499&lt;/code&gt; ma un altro, giusto?&lt;/p&gt;

&lt;p&gt;Sbagliato.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// &amp;lt;-- E0499 qui: il prestito di y è ancora vivo per via dell'uso successivo&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// &amp;lt;-- E0382 qui: uso di y dopo che è stato mosso da drop(y)&lt;/span&gt;
    &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abbiamo due errori distinti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;E0499&lt;/code&gt;: &lt;code&gt;cannot borrow 'x' as mutable more than once at a time&lt;/code&gt; — il secondo &lt;code&gt;&amp;amp;mut x&lt;/code&gt; è dichiarato mentre il primo prestito è ancora considerato &lt;em&gt;vivo&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;E0382&lt;/code&gt;: &lt;code&gt;use of moved value 'y'&lt;/code&gt; — &lt;code&gt;y&lt;/code&gt; è stato mosso da &lt;code&gt;drop(y)&lt;/code&gt; e viene poi usato.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il motivo del comportamento non è un "bug" del compilatore ma la conseguenza della &lt;strong&gt;Non-Lexical Lifetimes (NLL)&lt;/strong&gt;: il borrow checker lavora su MIR (&lt;em&gt;Mid-level Intermediate Representation&lt;/em&gt;) e usa analisi di liveness per estendere il lifetime di un prestito fino al suo ultimo uso identificato sul flusso di controllo.&lt;/p&gt;

&lt;p&gt;Io avevo pensato che utilizzando &lt;code&gt;drop()&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt; poi non sarebbe più stata disponibile, quindi invocandola successivamente a &lt;code&gt;let z = &amp;amp;mut x&lt;/code&gt; mi avrebbe dato un errore diverso, non l'errore E0499.&lt;/p&gt;

&lt;p&gt;In realtà non è così:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;drop(y)&lt;/code&gt; termina un prestito &lt;strong&gt;solo se&lt;/strong&gt; il binding &lt;strong&gt;non viene usato dopo&lt;/strong&gt;.&lt;br&gt;
 Se c’è un uso successivo, &lt;strong&gt;mediante NLL il compilatore estende retroattivamente&lt;/strong&gt; fino a quell’uso, rendendo &lt;code&gt;drop(y)&lt;/code&gt; irrilevante ai fini del borrow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Perché &lt;code&gt;drop()&lt;/code&gt; non accorcia un borrow mutabile
&lt;/h2&gt;

&lt;p&gt;Il comportamento che genera &lt;code&gt;E0499&lt;/code&gt; e &lt;code&gt;E0382&lt;/code&gt; è coerente con l'approccio moderno del compilatore Rust: NLL basato su MIR effettua liveness analysis e determina le regioni di borrow in base agli usi reali. &lt;code&gt;drop(y)&lt;/code&gt; non è una "bacchetta magica" che termina automaticamente la regione di un prestito se esistono usi successivi; anzi, &lt;code&gt;drop&lt;/code&gt; è un move che rende il binding non più utilizzabile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principio pratico&lt;/strong&gt;: assicurati che l'ultimo uso del primo &lt;code&gt;&amp;amp;mut&lt;/code&gt; preceda la creazione del successivo &lt;code&gt;&amp;amp;mut&lt;/code&gt;. Le tecniche più robuste per farlo sono ambiti espliciti, estrazione in funzioni e riprogettazione dei dati per evitare aliasing mutabile non necessario.&lt;/p&gt;

&lt;p&gt;E tu? Hai mai incontrato un caso simile?&lt;/p&gt;

&lt;p&gt;Fammelo sapere nei commenti!&lt;/p&gt;

&lt;p&gt;A presto&lt;/p&gt;

&lt;p&gt;Mirko&lt;/p&gt;

</description>
      <category>rust</category>
      <category>borrowchecker</category>
      <category>nonlexicallifetimes</category>
      <category>ownership</category>
    </item>
  </channel>
</rss>
