I need the lifetime of the trait method to outlive the lifetime of the struct, but I'm struggling with that.
Adding a 'b: 'a trait bound makes the compiler complain that it doesn't match the trait, since the trait doesn't have that constraint. And removing the bound causes the lifetimes to be unrelated, and hence I can't assign s = self.0
The nested lifetime (&'b mut MyStruct<'a>) implies 'a: 'b, because otherwise the reference would point to something invalid. The compiler makes use of this implied bound (e.g. you can take advantage of the bound within the function body).
In combination with the explicit bound 'b: 'a, this means that the two lifetimes must actually always be the same. So we can rewrite the method like so:
So what's the actual goal here? It's possible you're trying to create a self-referencial struct for example (a common reason to end up trying to borrow yourself forever).
If you want the trait implementations to be able to take advantage of lifetimes in the trait signature being long enough to match lifetimes in the Self type, then you must have a lifetime parameter in the trait. Otherwise, there's no way to express "this impl is only usable when the lifetime that appears in the trait method matches this lifetime in the type".