&'a mut self and Self aliasing more generally

fn foo(&'a mut self) is a red flag -- because if that 'a wasn't declared on the function, it's probably part of the Self struct. And if that's the case, this is a &'a mut Thing<'a> in disguise. As discussed in the previous section, this will make self unusable afterwards, and thus is an anti-pattern.

More generally, self types and the Self alias include any parameters on the type constructor post-resolution. Which means here:

#![allow(unused)]
fn main() {
struct Node<'a>(&'a str);

impl<'a> Node<'a> {
    fn new(s: &str) -> Self {
        Node(s)
    }
}
}

Self is an alias for Node<'a>. It is not an alias for Node<'_>. So it means:

#![allow(unused)]
fn main() {
    fn new<'s>(s: &'s str) -> Node<'a> {
}

And not:

#![allow(unused)]
fn main() {
    fn new<'s>(s: &'s str) -> Node<'s> {
}

And you really meant to code one of these:

#![allow(unused)]
fn main() {
    fn new(s: &'a str) -> Self {
    fn new(s: &str) -> Node<'_> {
}

Similarly, using Self as a constructor will use the resolved type parameters. So this won't work:

#![allow(unused)]
fn main() {
    fn new(s: &str) -> Node<'_> {
        Self(s)
    }
}

You need

#![allow(unused)]
fn main() {
    fn new(s: &str) -> Node<'_> {
        Node(s)
    }
}