I've found this piece of code on a reddit post that is very confusing to me.
//We'll recurse all we want, thank you very much!
#![allow(unconditional_recursion)]
use std::ops::Deref;
#[derive(Debug)]
struct Outer<T: Deref<Target = Outer<T>>> {
inner: T,
}
impl<T: Deref<Target = Outer<T>>> Deref for Outer<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
#[derive(Debug)]
struct Inner {}
impl Deref for Inner {
type Target = Outer<Inner>;
fn deref(&self) -> &Self::Target {
//Look at which struct we're implementing Deref for,
//and then read the next line very carefully.
&self.inner
}
}
const I: Inner = Inner {};
const O: Outer<Inner> = Outer { inner: I };
fn main() {
println!("{:?}", O.inner);
//Could just keep adding asterisks forever!
println!("{:?}", *O.inner);
println!("{:?}", **O.inner);
println!("{:?}", ***O.inner);
println!("{:?}", O);
//Could just keep adding asterisks forever!
println!("{:?}", *O);
println!("{:?}", **O);
println!("{:?}", ***O);
}
Specifically here:
impl Deref for Inner {
type Target = Outer<Inner>;
fn deref(&self) -> &Self::Target {
//Look at which struct we're implementing Deref for,
//and then read the next line very carefully.
&self.inner
}
}
How does the function return a reference to a field that belongs to another struct? Does &self actually refer to Outer here?
(Also this code crashes every time from stack overflow)