Cell<T> supports interior mutation for small copyable values without taking a mutable reference.

Program

Play the program to choose how many attempts update the shared counter.

retries
cell_attempt_counter.rs
Replay: real traced execution (multi-file project)
use std::cell::Cell;

fn main() {
    let retries = 2;
    let attempts = Cell::new(0);
    for _ in 0..retries {
        attempts.set(attempts.get() + 1);
    }
    println!("attempts={}", attempts.get());
}
use std::cell::Cell;

fn main() {
    let retries = 1;
    let attempts = Cell::new(0);
    for _ in 0..retries {
        attempts.set(attempts.get() + 1);
    }
    println!("attempts={}", attempts.get());
}
use std::cell::Cell;

fn main() {
    let retries = 3;
    let attempts = Cell::new(0);
    for _ in 0..retries {
        attempts.set(attempts.get() + 1);
    }
    println!("attempts={}", attempts.get());
}
  1. retries ← 2, attempts ← Cell { value: 0 }

    3fn main() {4    let retrie→ 2s = 2; //@retries=2, 1, 35    let attempt→ Cell { value: 0 }s = Cell::new(0);6    for _ in 0..retries {
  2. for _ in 0..retries

    pass 1 of 2
    5let attempts = Cell::new(0);6for _ in 0..retrie2s {7    attempts.set(attempts.get() + 1);8}
  3. for _ in 0..retries

    pass 2 of 2
    5let attempts = Cell::new(0);6for _ in 0..retrie2s {7    attempts.set(attempts.get() + 1);8}
  4. println!("attempts={}", attempts.get());

    8    }9    println!("attempts={}", attempts.get());10}
    outputattempts=2
  1. retries ← 1, attempts ← Cell { value: 0 }

    3fn main() {4    let retrie→ 1s = 1;5    let attempt→ Cell { value: 0 }s = Cell::new(0);6    for _ in 0..retries {
  2. for _ in 0..retries

    5let attempts = Cell::new(0);6for _ in 0..retrie1s {7    attempts.set(attempts.get() + 1);8}
  3. println!("attempts={}", attempts.get());

    8    }9    println!("attempts={}", attempts.get());10}
    outputattempts=1
  1. retries ← 3, attempts ← Cell { value: 0 }

    3fn main() {4    let retrie→ 3s = 3;5    let attempt→ Cell { value: 0 }s = Cell::new(0);6    for _ in 0..retries {
  2. for _ in 0..retries

    pass 1 of 3
    5let attempts = Cell::new(0);6for _ in 0..retrie3s {7    attempts.set(attempts.get() + 1);8}
  3. println!("attempts={}", attempts.get());

    8    }9    println!("attempts={}", attempts.get());10}
    outputattempts=3
Cell `Cell` lets code replace a copyable value even through a shared binding.
get `get` reads the current copy of the value.
set `set` writes a replacement value back into the cell.