-
Notifications
You must be signed in to change notification settings - Fork 498
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add basic GATs reference information #1265
Changes from 1 commit
60cd80a
5e8efd6
1ef107a
a7a54f5
dd84a62
dc1eeb4
0763b2e
3970ed3
37881f5
3c8acda
6b9e4ff
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -205,26 +205,46 @@ types cannot be defined in [inherent implementations] nor can they be given a | |
default implementation in traits. | ||
|
||
An *associated type declaration* declares a signature for associated type | ||
definitions. It is written as `type`, then an [identifier], and | ||
finally an optional list of trait bounds. | ||
definitions. It is written in one of the following forms, where `Assoc` is the | ||
name of the associated type, `Params` is a comma-separated list of type, | ||
lifetime or const parameters, `Bounds` is a plus-separated list of trait bounds | ||
on the associated type, and `WhereBounds` is a comma-separated list of bounds on | ||
parameters: | ||
|
||
```rust,ignore | ||
jackh726 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
type Assoc; | ||
type Assoc: Bounds; | ||
type Assoc<Params>; | ||
type Assoc<Params>: Bounds; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It occurs to me that it would be worth clarifying the distinction between There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That is stated in the paragraph above? Should we be more detailed? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we could be more explicit. Left some suggestions. WDYT? |
||
type Assoc<Params> where WhereBounds; | ||
type Assoc<Params>: Bounds where WhereBounds; | ||
``` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe something like Relationship between
|
||
|
||
The identifier is the name of the declared type alias. The optional trait bounds | ||
must be fulfilled by the implementations of the type alias. | ||
There is an implicit [`Sized`] bound on associated types that can be relaxed using the special `?Sized` bound. | ||
|
||
An *associated type definition* defines a type alias on another type. It is | ||
written as `type`, then an [identifier], then an `=`, and finally a [type]. | ||
An *associated type definition* defines a type alias on for the implementation | ||
jackh726 marked this conversation as resolved.
Show resolved
Hide resolved
nikomatsakis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
of a trait on a type. They are written similarly to an *associated type declaration*, | ||
but cannot contain `Bounds`, but instead must contain a `Type`: | ||
|
||
```rust,ignore | ||
jackh726 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
type Assoc = Type; | ||
type Assoc<Params> = Type<Params>; | ||
nikomatsakis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
type Assoc<Params> where WhereBounds = Type; | ||
type Assoc<Params> = Type where WhereBounds; | ||
jackh726 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
``` | ||
|
||
If a type `Item` has an associated type `Assoc` from a trait `Trait`, then | ||
`<Item as Trait>::Assoc` is a type that is an alias of the type specified in the | ||
associated type definition. Furthermore, if `Item` is a type parameter, then | ||
`Item::Assoc` can be used in type parameters. | ||
|
||
Associated types may include [generic parameters] or [where clauses]; these may | ||
be referred to as generic associated types, or GATs. If the type `Thing` has an | ||
associated type `Item` from a trait `Trait` with the generics `<'a>` , the type | ||
can be named like `<Thing as Trait>::Item<'x>`, where `'x` is some lifetime in | ||
scope. In this case, `'x` will be used wherever `'a` appears in the associated | ||
Associated types may include [generic parameters] and [where clauses]; these are | ||
often referred to as *generic associated types*, or *GATs*. If the type `Thing` | ||
has an associated type `Item` from a trait `Trait` with the generics `<'a>` , the | ||
type can be named like `<Thing as Trait>::Item<'x>`, where `'x` is some lifetime | ||
in scope. In this case, `'x` will be used wherever `'a` appears in the associated | ||
type definitions on impls. | ||
|
||
```rust | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ | |
> _TypeAlias_ :\ | ||
> `type` [IDENTIFIER] [_GenericParams_]<sup>?</sup> | ||
> ( `:` [_TypeParamBounds_] )<sup>?</sup> | ||
> [_WhereClause_]<sup>?</sup> ( `=` [_Type_] )<sup>?</sup> [_WhereClause_]<sup>?</sup> `;` | ||
> [_WhereClause_]<sup>?</sup> ( `=` [_Type_] [_WhereClause_]<sup>?</sup>)<sup>?</sup> `;` | ||
|
||
A _type alias_ defines a new name for an existing [type]. Type aliases are | ||
declared with the keyword `type`. Every value has a single, specific type, but | ||
|
@@ -34,11 +34,15 @@ let _ = TypeAlias(5); // Doesn't work | |
A type alias without the [_Type_] specification may only appear as an | ||
[associated type] in a [trait]. | ||
|
||
A type alias with the [_Type_] specification may only appear as an | ||
[associated type] in a [trait impl]. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This clause by itself doesn't seem to be correct to me. It seems to imply that the following is not allowed: type X = i32; Perhaps this could be turned around so that it specifically says what a trait impl associated type needs? A sentence could be added to the previous paragraph, since they are talking about the same thing. Maybe something like this: A type alias without the [Type] specification may only appear as an [associated type] in a [trait]. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've made a separate paragraph for each for of type aliases, to be specific about what is allow, what is required, and what isn't allowed in each. |
||
|
||
A type alias with [_TypeParamBounds_] may only specified when used as | ||
an [associated type] in a [trait]. | ||
|
||
A type alias with where clauses after the equals sign may only appear as an | ||
[associated type] in a [trait] or a [trait impl]. | ||
Where clauses before the equals sign on a type alias in a [trait impl] (like | ||
jackh726 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
`type TypeAlias<T> where T: Foo = Bar<T>`) are deprecated. Where clauses after | ||
the equals sign (like `type TypeAlias<T> where T: Foo = Bar<T>`) are preferred. | ||
|
||
[IDENTIFIER]: ../identifiers.md | ||
[_GenericParams_]: generics.md | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.