Error code E0801
The self
parameter in a method has an invalid generic "receiver type".
Erroneous code example:
#![allow(unused)] fn main() { struct Foo; impl Foo { fn foo<R: std::ops::Deref<Target=Self>>(self: R) {} } }
or alternatively,
#![allow(unused)] fn main() { struct Foo; impl Foo { fn foo(self: impl std::ops::Deref<Target=Self>) {} } }
Methods take a special first parameter, termed self
. It's normal to
use self
, &self
or &mut self
, which are syntactic sugar for
self: Self
, self: &Self
, and self: &mut Self
respectively.
But it's also possible to use more sophisticated types of self
parameter, for instance std::rc::Rc<Self>
. The set of allowable
Self
types is extensible using the nightly feature
Arbitrary self types.
This will extend the valid set of Self
types to anything which implements
std::ops::Deref<Target=Self>
, for example Rc<Self>
, Box<Self>
, or
your own smart pointers that do the same.
However, even with that feature, the self
type must be concrete.
Generic self
types are not permitted. Specifically, a self
type will
be rejected if it is a type parameter defined on the method.
These are OK:
#![allow(unused)] fn main() { struct Foo; impl Foo { fn foo(self) {} fn foo2(self: std::rc::Rc<Self>) {} // or some other similar // smart pointer if you enable arbitrary self types and // the pointer implements Deref<Target=Self> } }