Hone logo
Hone
Problems

Mastering Move Closures in Rust

Rust's ownership system is a core feature that ensures memory safety. Closures, as first-class citizens, interact with this system in powerful ways. This challenge focuses on understanding and implementing closures that take ownership of their captured variables, often referred to as "move closures." This is crucial for scenarios where you need to transfer ownership of data to a closure, such as when spawning threads or handing off computation.

Problem Description

Your task is to create a Rust function that returns a closure. This closure must capture an i32 value by moving ownership into itself. The closure, when called, should then modify and return this captured i32.

Specifically, you need to:

  1. Define a function, let's call it create_move_closure, that accepts an i32 value as an argument.
  2. Inside create_move_closure, create a closure that:
    • Captures the i32 argument by moving ownership.
    • When the closure is called, it should increment the captured i32 by 1.
    • The closure should return the new, incremented value of the captured i32.
  3. The create_move_closure function should return this closure.

This exercise will help you solidify your understanding of how closures interact with Rust's ownership rules, particularly the move keyword and its implications.

Examples

Example 1:

Input: 5 (passed to create_move_closure)
// Inside create_move_closure, the input is 5
let closure = create_move_closure(5);

// Calling the closure
let result = closure(); // The closure increments 5 to 6 and returns it
Output: 6
Explanation: The `create_move_closure` function takes `5`. A move closure is created that takes ownership of `5`. When the closure is called, it increments `5` to `6` and returns it.

Example 2:

Input: 0 (passed to create_move_closure)
let closure = create_move_closure(0);
let result1 = closure(); // Increments 0 to 1, returns 1
let result2 = closure(); // Increments 1 to 2, returns 2
Output: 2
Explanation: The closure captures `0`. The first call returns `1`. The second call, operating on the *same* captured value (which is now `1`), increments it to `2` and returns `2`. This demonstrates that the closure maintains its internal state.

Constraints

  • The input to create_move_closure will always be an i32.
  • The closure returned must explicitly use the move keyword to capture its environment.
  • The closure should be callable multiple times, and each call should increment the internal state.

Notes

  • Recall that closures can capture variables in three ways: by immutable reference (&T), by mutable reference (&mut T), or by value (moving ownership, T). The move keyword forces capture by value.
  • Consider what happens if you try to use the original variable after it has been moved into the closure.
  • You'll need to define the return type of create_move_closure carefully to represent a closure that returns an i32 and takes no arguments. The FnMut trait is relevant here because the closure modifies its captured state.
Loading editor...
rust