Smart Pointers
Deref
Custom Pointer-Like Wrapper
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.
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}");
}
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}");next ← 6
15 let meter = Meter(base);16 let nex→ 6t = *mete(empty)r + 1;17 println!("{next}");18}output6
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}");next ← 4
15 let meter = Meter(base);16 let nex→ 4t = *mete(empty)r + 1;17 println!("{next}");18}output4
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}");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.