11# Associated Items
22
3+ r[ items.associated]
4+
5+ r[ items.associated.syntax]
36> ** <sup >Syntax</sup >** \
47> _ AssociatedItem_ :\
58>   ;  ; [ _ OuterAttribute_ ] <sup >\* </sup > (\
69>   ;  ;   ;  ;   ;  ; [ _ MacroInvocationSemi_ ] \
710>   ;  ;   ;  ; | ( [ _ Visibility_ ] <sup >?</sup > ( [ _ TypeAlias_ ] | [ _ ConstantItem_ ] | [ _ Function_ ] ) )\
811>   ;  ; )
912
13+ r[ items.associated.intro]
1014* Associated Items* are the items declared in [ traits] or defined in
1115[ implementations] . They are called this because they are defined on an associate
12- type &mdash ; the type in the implementation. They are a subset of the kinds of
13- items you can declare in a module. Specifically, there are [ associated
14- functions] (including methods), [ associated types] , and [ associated constants] .
16+ type &mdash ; the type in the implementation.
17+
18+ r[ items.associated.kinds]
19+ They are a subset of the kinds of items you can declare in a module.
20+ Specifically, there are [ associated functions] (including methods), [ associated types] , and [ associated constants] .
1521
1622[ associated functions ] : #associated-functions-and-methods
1723[ associated types ] : #associated-types
1824[ associated constants ] : #associated-constants
1925
26+ r[ items.associated.related]
2027Associated items are useful when the associated item logically is related to the
2128associating item. For example, the ` is_some ` method on ` Option ` is intrinsically
2229related to Options, so should be associated.
2330
31+ r[ items.associated.decl-def]
2432Every associated item kind comes in two varieties: definitions that contain the
2533actual implementation and declarations that declare signatures for
2634definitions.
2735
36+ r[ items.associated.trait-items]
2837It is the declarations that make up the contract of traits and what is available
2938on generic types.
3039
3140## Associated functions and methods
3241
42+ r[ items.associated.fn]
43+
44+ r[ items.associated.fn.intro]
3345* Associated functions* are [ functions] associated with a type.
3446
47+ r[ items.associated.fn.decl]
3548An * associated function declaration* declares a signature for an associated
3649function definition. It is written as a function item, except the
3750function body is replaced with a ` ; ` .
3851
39- The identifier is the name of the function. The generics, parameter list,
40- return type, and where clause of the associated function must be the same as the
52+ r[ items.associated.name]
53+ The identifier is the name of the function.
54+
55+ r[ items.associated.same-signature]
56+ The generics, parameter list, return type, and where clause of the associated function must be the same as the
4157associated function declarations's.
4258
59+ r[ items.associated.fn.def]
4360An * associated function definition* defines a function associated with another
4461type. It is written the same as a [ function item] .
4562
@@ -64,6 +81,7 @@ fn main () {
6481}
6582```
6683
84+ r[ items.associated.fn.qualified-self]
6785When the associated function is declared on a trait, the function can also be
6886called with a [ path] that is a path to the trait appended by the name of the
6987trait. When this happens, it is substituted for ` <_ as Trait>::function_name ` .
@@ -86,10 +104,14 @@ let _: f64 = f64::from_i32(42);
86104
87105### Methods
88106
107+ r[ items.associated.fn.method]
108+
109+ r[ items.associated.fn.method.intro]
89110Associated functions whose first parameter is named ` self ` are called * methods*
90111and may be invoked using the [ method call operator] , for example, ` x.foo() ` , as
91112well as the usual function call notation.
92113
114+ r[ items.associated.fn.method.self-ty]
93115If the type of the ` self ` parameter is specified, it is limited to types resolving
94116to one generated by the following grammar (where ` 'lt ` denotes some arbitrary
95117lifetime):
@@ -127,6 +149,7 @@ impl Example {
127149}
128150```
129151
152+ r[ associated.fn.method.self-pat-shorthands]
130153Shorthand syntax can be used without specifying a type, which have the
131154following equivalents:
132155
@@ -138,6 +161,7 @@ Shorthand | Equivalent
138161
139162> ** Note** : Lifetimes can be, and usually are, elided with this shorthand.
140163
164+ r[ associated.fn.method.self-pat-mut]
141165If the ` self ` parameter is prefixed with ` mut ` , it becomes a mutable variable,
142166similar to regular parameters using a ` mut ` [ identifier pattern] . For example:
143167
@@ -189,21 +213,30 @@ let circle_shape = Circle::new();
189213let bounding_box = circle_shape . bounding_box ();
190214```
191215
216+ r[ items.associated.fn.params.edition2015]
192217> ** Edition differences** : In the 2015 edition, it is possible to declare trait
193218> methods with anonymous parameters (e.g. ` fn foo(u8) ` ). This is deprecated and
194219> an error as of the 2018 edition. All parameters must have an argument name.
195220
196221#### Attributes on method parameters
197222
223+ r[ items.associated.fn.param-attributes]
224+
198225Attributes on method parameters follow the same rules and restrictions as
199226[ regular function parameters] .
200227
201228## Associated Types
202229
203- * Associated types* are [ type aliases] associated with another type. Associated
204- types cannot be defined in [ inherent implementations] nor can they be given a
230+ r[ items.associated.type]
231+
232+ r[ items.associated.type.intro]
233+ * Associated types* are [ type aliases] associated with another type.
234+
235+ r[ items.associated.type.restrictions]
236+ Associated types cannot be defined in [ inherent implementations] nor can they be given a
205237default implementation in traits.
206238
239+ r[ items.associated.type.decl]
207240An * associated type declaration* declares a signature for associated type
208241definitions. It is written in one of the following forms, where ` Assoc ` is the
209242name of the associated type, ` Params ` is a comma-separated list of type,
@@ -221,13 +254,21 @@ type Assoc<Params> where WhereBounds;
221254type Assoc<Params>: Bounds where WhereBounds;
222255```
223256
224- The identifier is the name of the declared type alias. The optional trait bounds
225- must be fulfilled by the implementations of the type alias.
257+ r[ items.associated.type.name]
258+ The identifier is the name of the declared type alias.
259+
260+ r[ items.associated.type.impl-fulfillment]
261+ The optional trait bounds must be fulfilled by the implementations of the type alias.
262+
263+ r[ items.associated.type.sized]
226264There is an implicit [ ` Sized ` ] bound on associated types that can be relaxed using the special ` ?Sized ` bound.
227265
266+ r[ items.associated.type.def]
228267An * associated type definition* defines a type alias for the implementation
229- of a trait on a type. They are written similarly to an * associated type declaration* ,
230- but cannot contain ` Bounds ` , but instead must contain a ` Type ` :
268+ of a trait on a type
269+
270+ r[ items.associated.type.def.restriction]
271+ They are written similarly to an * associated type declaration* , but cannot contain ` Bounds ` , but instead must contain a ` Type ` :
231272
232273<!-- ignore: illustrative example forms -->
233274``` rust,ignore
@@ -237,11 +278,15 @@ type Assoc<Params> = Type where WhereBounds;
237278type Assoc<Params> where WhereBounds = Type; // deprecated, prefer the form above
238279```
239280
281+ r[ items.associated.type.alias]
240282If a type ` Item ` has an associated type ` Assoc ` from a trait ` Trait ` , then
241283` <Item as Trait>::Assoc ` is a type that is an alias of the type specified in the
242- associated type definition. Furthermore, if ` Item ` is a type parameter, then
243- ` Item::Assoc ` can be used in type parameters.
284+ associated type definition
285+
286+ r[ items.associated.type.param]
287+ Furthermore, if ` Item ` is a type parameter, then ` Item::Assoc ` can be used in type parameters.
244288
289+ r[ items.associated.type.generic]
245290Associated types may include [ generic parameters] and [ where clauses] ; these are
246291often referred to as * generic associated types* , or * GATs* . If the type ` Thing `
247292has an associated type ` Item ` from a trait ` Trait ` with the generics ` <'a> ` , the
@@ -300,7 +345,6 @@ fn borrow<'a, T: Lend>(array: &'a mut T) -> <T as Lend>::Lender<'a> {
300345 array . lend ()
301346}
302347
303-
304348fn main () {
305349 let mut array = [0usize ; 16 ];
306350 let lender = borrow (& mut array );
@@ -352,11 +396,15 @@ Given a reference to the associated type like `<X as Example>::Output<Y>`, the a
352396
353397### Required where clauses on generic associated types
354398
399+ r[ items.associated.type.generic-where-clause]
400+
401+ r[ items.associated.type.generic-where-clause.intro]
355402Generic associated type declarations on traits currently may require a list of
356403where clauses, dependent on functions in the trait and how the GAT is used. These
357404rules may be loosened in the future; updates can be found [ on the generic
358405associated types initiative repository] ( https://rust-lang.github.io/generic-associated-types-initiative/explainer/required_bounds.html ) .
359406
407+ r[ items.associated.type.generic-where-clause.valid-fn]
360408In a few words, these where clauses are required in order to maximize the allowed
361409definitions of the associated type in impls. To do this, any clauses that * can be
362410proven to hold* on functions (using the parameters of the function or trait)
@@ -373,6 +421,7 @@ In the above, on the `next` function, we can prove that `Self: 'a`, because of
373421the implied bounds from ` &'a mut self ` ; therefore, we must write the equivalent
374422bound on the GAT itself: ` where Self: 'x ` .
375423
424+ r[ items.associated.type.generic-where-clause.intersection]
376425When there are multiple functions in a trait that use the GAT, then the
377426* intersection* of the bounds from the different functions are used, rather than
378427the union.
@@ -390,6 +439,7 @@ know that `T: 'a` on `create_checker`, we do not know that on `do_check`. Howeve
390439if ` do_check ` was commented out, then the ` where T: 'x ` bound would be required
391440on ` Checker ` .
392441
442+ r[ items.associated.type.generic-where-clause.forward]
393443The bounds on associated types also propagate required where clauses.
394444
395445``` rust
@@ -404,6 +454,7 @@ Here, `where Self: 'a` is required on `Item` because of `iter`. However, `Item`
404454is used in the bounds of ` Iterator ` , the ` where Self: 'a ` clause is also required
405455there.
406456
457+ r[ items.associated.type.generic-where-clause.static]
407458Finally, any explicit uses of ` 'static ` on GATs in the trait do not count towards
408459the required bounds.
409460
@@ -416,18 +467,25 @@ trait StaticReturn {
416467
417468## Associated Constants
418469
470+ r[ items.associated.const]
471+
472+ r[ items.associated.const.intro]
419473* Associated constants* are [ constants] associated with a type.
420474
475+ r[ items.associated.const.decl]
421476An * associated constant declaration* declares a signature for associated
422477constant definitions. It is written as ` const ` , then an identifier,
423478then ` : ` , then a type, finished by a ` ; ` .
424479
480+ r[ items.associated.const.name]
425481The identifier is the name of the constant used in the path. The type is the
426482type that the definition has to implement.
427483
484+ r[ items.associated.const.def]
428485An * associated constant definition* defines a constant associated with a
429486type. It is written the same as a [ constant item] .
430487
488+ r[ items.associated.const.eval]
431489Associated constant definitions undergo [ constant evaluation] only when
432490referenced. Further, definitions that include [ generic parameters] are
433491evaluated after monomorphization.
0 commit comments