Shared State Patterns
Cell Attempt Counter
Update a Copy Value
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.
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());
}
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 {for _ in 0..retries
pass 1 of 25let attempts = Cell::new(0);6for _ in 0..retrie2s {7 attempts.set(attempts.get() + 1);8}for _ in 0..retries
pass 2 of 25let attempts = Cell::new(0);6for _ in 0..retrie2s {7 attempts.set(attempts.get() + 1);8}println!("attempts={}", attempts.get());
8 }9 println!("attempts={}", attempts.get());10}outputattempts=2
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 {for _ in 0..retries
5let attempts = Cell::new(0);6for _ in 0..retrie1s {7 attempts.set(attempts.get() + 1);8}println!("attempts={}", attempts.get());
8 }9 println!("attempts={}", attempts.get());10}outputattempts=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 {for _ in 0..retries
pass 1 of 35let attempts = Cell::new(0);6for _ in 0..retrie3s {7 attempts.set(attempts.get() + 1);8}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.