<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Move-Semantics on ErrorVault — Developer Error Code Dictionary</title><link>https://errorvault.dev/tags/move-semantics/</link><description>Recent content in Move-Semantics on ErrorVault — Developer Error Code Dictionary</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 29 Apr 2026 03:08:04 +0800</lastBuildDate><atom:link href="https://errorvault.dev/tags/move-semantics/feed.xml" rel="self" type="application/rss+xml"/><item><title>Fix E0524: Rust Compiler Error - Variable Previously Captured</title><link>https://errorvault.dev/rust/rust-e0524-variable-previously-captured/</link><pubDate>Wed, 29 Apr 2026 03:08:04 +0800</pubDate><guid>https://errorvault.dev/rust/rust-e0524-variable-previously-captured/</guid><description>&lt;h2 id="1-symptoms">1. Symptoms&lt;/h2>
&lt;p>The Rust compiler emits error E0524 when attempting to use a variable that has already been captured by a closure. This error manifests in several distinct patterns that Rust developers commonly encounter.&lt;/p>
&lt;p>&lt;strong>Primary Error Message:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-rust" data-lang="rust">&lt;span style="display:flex;">&lt;span>error[E0524]: `x` was previously captured by this closure
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">-&lt;/span>-&amp;gt; &lt;span style="color:#50fa7b">src&lt;/span>&lt;span style="color:#ff79c6">/&lt;/span>main.rs:&lt;span style="color:#bd93f9">6&lt;/span>:&lt;span style="color:#bd93f9">5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bd93f9">3&lt;/span> &lt;span style="color:#ff79c6">|&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> c2 &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">|&lt;/span> &lt;span style="color:#ff79c6">--&lt;/span> first capture is here
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bd93f9">4&lt;/span> &lt;span style="color:#ff79c6">|&lt;/span> println!(&lt;span style="color:#f1fa8c">&amp;#34;&lt;/span>&lt;span style="color:#f1fa8c">{:?}&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;&lt;/span>, x);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">|&lt;/span> &lt;span style="color:#ff79c6">-&lt;/span> &lt;span style="color:#ff79c6">^&lt;/span> first borrow is here
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bd93f9">5&lt;/span> &lt;span style="color:#ff79c6">|&lt;/span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bd93f9">6&lt;/span> &lt;span style="color:#ff79c6">|&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">drop&lt;/span>(x);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">|&lt;/span> &lt;span style="color:#ff79c6">^&lt;/span> second &lt;span style="color:#ff79c6">move&lt;/span> into this closure
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">|&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">=&lt;/span> note: &lt;span style="color:#50fa7b">closure&lt;/span> cannot be invoked once a variable from the outer scope has been moved out of
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">=&lt;/span> note: &lt;span style="color:#50fa7b">this&lt;/span> error originates &lt;span style="color:#ff79c6">in&lt;/span> the &lt;span style="color:#ff79c6">macro&lt;/span> `&lt;span style="color:#ff79c6">$crate&lt;/span>:: &lt;span style="color:#50fa7b">println&lt;/span> :: &lt;span style="color:#50fa7b">macro&lt;/span> :: &lt;span style="color:#50fa7b">_____&lt;/span> &lt;span style="color:#ff79c6">$&lt;/span>`
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">---&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">**&lt;/span>Additional Error Manifestations:&lt;span style="color:#ff79c6">**&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>```rust
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">// Example 1: Double move error
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> x &lt;span style="color:#ff79c6">=&lt;/span> vec![&lt;span style="color:#bd93f9">1&lt;/span>, &lt;span style="color:#bd93f9">2&lt;/span>, &lt;span style="color:#bd93f9">3&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> closure1 &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> _y &lt;span style="color:#ff79c6">=&lt;/span> x; &lt;span style="color:#6272a4">// x is moved here
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> closure2 &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> _z &lt;span style="color:#ff79c6">=&lt;/span> x; &lt;span style="color:#6272a4">// E0524: x was already moved
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">// Example 2: Move after borrow
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> &lt;span style="color:#ff79c6">mut&lt;/span> data &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#8be9fd;font-style:italic">String&lt;/span>::from(&lt;span style="color:#f1fa8c">&amp;#34;hello&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> print_fn &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> println!(&lt;span style="color:#f1fa8c">&amp;#34;&lt;/span>&lt;span style="color:#f1fa8c">{}&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;&lt;/span>, data); &lt;span style="color:#6272a4">// borrowed here
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span>&lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> modify_fn &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> data.push_str(&lt;span style="color:#f1fa8c">&amp;#34; world&amp;#34;&lt;/span>); &lt;span style="color:#6272a4">// E0524: cannot move after borrow
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">// Example 3: Complex closure scenario
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span>&lt;span style="color:#ff79c6">fn&lt;/span> &lt;span style="color:#50fa7b">main&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> value &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#bd93f9">42&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> closure_a &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> _captured &lt;span style="color:#ff79c6">=&lt;/span> value;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> println!(&lt;span style="color:#f1fa8c">&amp;#34;closure_a took ownership&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8be9fd;font-style:italic">let&lt;/span> closure_b &lt;span style="color:#ff79c6">=&lt;/span> &lt;span style="color:#ff79c6">||&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> println!(&lt;span style="color:#f1fa8c">&amp;#34;value is still needed here: &lt;/span>&lt;span style="color:#f1fa8c">{}&lt;/span>&lt;span style="color:#f1fa8c">&amp;#34;&lt;/span>, value); &lt;span style="color:#6272a4">// E0524
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4">&lt;/span> };
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> closure_a();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> closure_b();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The compiler error always indicates which closure performed the first capture and which line attempted the second capture, making it relatively straightforward to identify the conflict point.&lt;/p></description></item></channel></rss>