Types that implement Deref can behave like references at the use site.

Program

Play the program to wrap a number, dereference the wrapper, and add one.

base
deref_wrapper.rs
Replay: real traced execution (multi-file project)
use std::ops::Deref;

struct Meter(i32);

impl Deref for Meter {
    type Target = i32;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn main() {
    let base = 5;
    let meter = Meter(base);
    let next = *meter + 1;
    println!("{next}");
}
use std::ops::Deref;

struct Meter(i32);

impl Deref for Meter {
    type Target = i32;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn main() {
    let base = 3;
    let meter = Meter(base);
    let next = *meter + 1;
    println!("{next}");
}
use std::ops::Deref;

struct Meter(i32);

impl Deref for Meter {
    type Target = i32;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn main() {
    let base = 8;
    let meter = Meter(base);
    let next = *meter + 1;
    println!("{next}");
}
  1. base ← 5, meter ← (empty)

    13fn main() {14    let bas→ 5e = 5; //@base=5, 3, 815    let mete→ (empty)r = Meter(bas5e);16    let next = *mete(empty)r + 1;17    println!("{next}");
  2. next ← 6

    15    let meter = Meter(base);16    let nex→ 6t = *mete(empty)r + 1;17    println!("{next}");18}
    output6
  1. base ← 3, meter ← (empty)

    13fn main() {14    let bas→ 3e = 3;15    let mete→ (empty)r = Meter(bas3e);16    let next = *mete(empty)r + 1;17    println!("{next}");
  2. next ← 4

    15    let meter = Meter(base);16    let nex→ 4t = *mete(empty)r + 1;17    println!("{next}");18}
    output4
  1. base ← 8, meter ← (empty)

    13fn main() {14    let bas→ 8e = 8;15    let mete→ (empty)r = Meter(bas8e);16    let next = *mete(empty)r + 1;17    println!("{next}");
  2. next ← 9

    15    let meter = Meter(base);16    let nex→ 9t = *mete(empty)r + 1;17    println!("{next}");18}
    output9
Deref `Deref` tells Rust how to reach the wrapped target value.
associated type `type Target = i32` declares what dereferencing produces.
operator `*meter` calls the dereference behavior and reads the inner integer.