Rust closures: capturing the environment and the Fn traits
Answer: Rust's closures are anonymous functions you can save in a variable or pass as arguments to other functions. Unlike functions, closures can capture values from the scope in which they're defined. (S1)
Syntax
- Closures don't usually require you to annotate the types of the parameters or the return value like fn functions do. (S1)
- Calling a closure is exactly like calling a function. (S2)
- Once a closure's type has been inferred, it cannot be inferred again with another type. (S2)
Capturing
- Closures can capture values from their environment in three ways: borrowing immutably, borrowing mutably, and taking ownership. (S1)
- If you want to force the closure to take ownership of the values it uses in the environment, you can use the move keyword before the parameter list. (S1)
The Fn traits
- The way a closure captures and handles values from the environment affects which traits the closure implements. (S1)
- FnOnce applies to closures that can be called once, and all closures implement at least this trait because all closures can be called. (S1)
- A closure that moves captured values out of its body will only implement FnOnce and none of the other Fn traits. (S1)
- FnMut applies to closures that don't move captured values out of their body but might mutate the captured values. (S1)
- If what we want to do doesn't require capturing a value from the environment, we can use the name of a function rather than a closure. (S1)
Claims
- id: C1 claim: Closures can capture values from their defining scope. source: S1 evidence: "closures can capture values from the scope in which they’re defined."
- id: C2 claim: move forces a closure to take ownership. source: S1 evidence: "you can use the move keyword before the parameter list."
- id: C3 claim: All closures implement FnOnce. source: S1 evidence: "at least this trait because all closures can be called."
- id: C4 claim: Closures capture the enclosing environment. source: S2 evidence: "Closures are functions that can capture the enclosing environment."
Sources
- [S1] Closures - The Rust Programming Language. The Rust Programming Language. https://doc.rust-lang.org/book/ch13-01-closures.html . License: MIT or Apache-2.0 (rust-lang/book; Copyright (c) 2010 The Rust Project Developers; https://github.com/rust-lang/book/blob/main/LICENSE-MIT). Accessed 2026-11-04.
- [S2] Closures - Rust By Example. Rust by Example. https://doc.rust-lang.org/rust-by-example/fn/closures.html . License: MIT or Apache-2.0 (rust-lang/rust-by-example; Copyright (c) 2014 Jorge Aparicio; https://github.com/rust-lang/rust-by-example/blob/master/LICENSE-MIT). Accessed 2026-11-04.
License: this note is CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Summary by iinventedlight (AI-assisted).
License: CC-BY-4.0 · Summary by iinventedlight (AI-assisted). Sources: The Rust Programming Language, Closures - The Rust Programming Language, MIT or Apache-2.0 (rust-lang/book; Copyright (c) 2010 The Rust Project Developers; https://github.com/rust-lang/book/blob/main/LICENSE-MIT); Rust by Example, Closures - Rust By Example, MIT or Apache-2.0 (rust-lang/rust-by-example; Copyright (c) 2014 Jorge Aparicio; https://github.com/rust-lang/rust-by-example/blob/master/LICENSE-MIT).
Cite this
iinventedlight. 2026. "Rust closures: capturing the environment and the Fn traits." iinventedlight Library, iil:note:da4dnh1w, version of 2026-11-04. https://iinventedlight.com/library/notes/rust-closures/. License: CC-BY-4.0.
@misc{iil_note_da4dnh1w,
author = {{iinventedlight}},
title = {{Rust closures: capturing the environment and the Fn traits}},
howpublished = {iinventedlight Library},
year = {2026},
date = {2026-11-04},
url = {https://iinventedlight.com/library/notes/rust-closures/},
note = {Permanent ID iil:note:da4dnh1w. License: CC-BY-4.0.},
}
Spotted a mistake? Use the MCP feedback tool or email hello@iinventedlight.com.
For language models and agents: start at /llms.txt. This page in Markdown: /library/notes/rust-closures.md.