The Self
keyword was used outside an impl, trait, or type definition.
Erroneous code example:
<Self>::foo; // error: use of `Self` outside of an impl, trait, or type
// definition
RunThe 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:
trait Foo {
type Bar;
}
trait Baz : Foo {
fn bar() -> Self::Bar; // like this
}
RunHowever, be careful when two types have a common associated type:
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`
}
RunThis problem can be solved by specifying from which trait we want to use the
Bar
type:
trait Foo {
type Bar;
}
trait Foo2 {
type Bar;
}
trait Baz : Foo + Foo2 {
fn bar() -> <Self as Foo>::Bar; // ok!
}
Run