Error code E0411
The Self
keyword was used outside an impl, trait, or type definition.
Erroneous code example:
#![allow(unused)] fn main() { <Self>::foo; // error: use of `Self` outside of an impl, trait, or type // definition }
The Self
keyword represents the current type, which explains why it can only
be used inside an impl, trait, or type definition. It gives access to the
associated items of a type:
#![allow(unused)] fn main() { trait Foo { type Bar; } trait Baz : Foo { fn bar() -> Self::Bar; // like this } }
However, be careful when two types have a common associated type:
#![allow(unused)] fn main() { trait Foo { type Bar; } trait Foo2 { type Bar; } trait Baz : Foo + Foo2 { fn bar() -> Self::Bar; // error: ambiguous associated type `Bar` in bounds of `Self` } }
This problem can be solved by specifying from which trait we want to use the
Bar
type:
#![allow(unused)] fn main() { trait Foo { type Bar; } trait Foo2 { type Bar; } trait Baz : Foo + Foo2 { fn bar() -> <Self as Foo>::Bar; // ok! } }