generics - What does this syntax mean (<T=Self>) and when to use it? -
i see things <t=self> or t=() in generic structs/traits. suspect has default types generic type t. couldn't find documentation though.
my questions are:
- what mean?
- what variations possible (maybe crazy
<t=self: 'static>)? - when useful (examples)?
this syntax can used in 2 situations: default type parameters, , associated types. see difference , le use, lets have @ add trait, used define + operator:
pub trait add<rhs = self> { type output; fn add(self, rhs: rhs) -> self::output; } default type parameters
here, type parameter rhs has default value: self. means that, whenever use trait, value of type parameter default self if omit it. example:
impl add foo { /* ... */ } is same as
impl add<foo> foo { /* ... */ } likewise,
fn foo<t>(t: t) t: add { /* ... */ } is same
fn foo<t>(t: t) t: add<t> { /* ... */ } associated types
the trait add has associated type : output. type chosen implementation of trait.
the reason behind not make sense implement add different output types while input types same: once self , rhs known, output type cannot chosen.
this construct used iterators example, when iterate on container, not choose type of values generated iterator: associated type.
it possible select value associated type in where clauses, using foo = bar syntax. example:
fn foo<i>(i: i) i: iterator<item=u8> { /* ... */ } this function can work on iterator yielding u8 values.
to sum up
the syntax foo=bar used in definition of generic construct allows set default value type parameter, , used in where clauses allows match on value of associated type.
there no possible variations foo = bar : baz or things that.
Comments
Post a Comment