Update section on "existential type" to "opaque type"
This commit is contained in:
parent
9c6beb5bdd
commit
20d27f2dda
|
|
@ -1,48 +0,0 @@
|
|||
# Existential Types
|
||||
|
||||
Existential types are essentially strong type aliases which only expose
|
||||
a specific set of traits as their interface and the concrete type in the
|
||||
background is inferred from a certain set of use sites of the existential
|
||||
type.
|
||||
|
||||
In the language they are expressed via
|
||||
|
||||
```rust,ignore
|
||||
existential type Foo: Bar;
|
||||
```
|
||||
|
||||
This is in existential type named `Foo` which can be interacted with via
|
||||
the `Bar` trait's interface.
|
||||
|
||||
Since there needs to be a concrete background type, you can currently
|
||||
express that type by using the existential type in a "defining use site".
|
||||
|
||||
```rust,ignore
|
||||
struct Struct;
|
||||
impl Bar for Struct { /* stuff */ }
|
||||
fn foo() -> Foo {
|
||||
Struct
|
||||
}
|
||||
```
|
||||
|
||||
Any other "defining use site" needs to produce the exact same type.
|
||||
|
||||
## Defining use site(s)
|
||||
|
||||
Currently only the return value of a function inside can
|
||||
be a defining use site of an existential type (and only if the return
|
||||
type of that function contains the existential type).
|
||||
|
||||
The defining use of an existential type can be any code *within* the parent
|
||||
of the existential type definition. This includes any siblings of the
|
||||
existential type and all children of the siblings.
|
||||
|
||||
The initiative for *"not causing fatal brain damage to developers due to
|
||||
accidentally running infinite loops in their brain while trying to
|
||||
comprehend what the type system is doing"* has decided to disallow children
|
||||
of existential types to be defining use sites.
|
||||
|
||||
### Associated existential types
|
||||
|
||||
Associated existential types can be defined by any other associated item
|
||||
on the same trait `impl` or a child of these associated items.
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
# Opaque types (type alias `impl Trait`)
|
||||
|
||||
Opaque types are syntax to declare an opaque type alias that only
|
||||
exposes a specific set of traits as their interface; the concrete type in the
|
||||
background is inferred from a certain set of use sites of the opaque type.
|
||||
|
||||
This is expressed by using `impl Trait` within type aliases, for example:
|
||||
|
||||
```rust,ignore
|
||||
type Foo = impl Bar;
|
||||
```
|
||||
|
||||
This declares an opaque type named `Foo`, of which the only information is that
|
||||
it implements `Bar`. Therefore, any of `Bar`'s interface can be used on a `Foo`,
|
||||
but nothing else (regardless of whether it implements any other traits).
|
||||
|
||||
Since there needs to be a concrete background type, you can currently
|
||||
express that type by using the opaque type in a "defining use site".
|
||||
|
||||
```rust,ignore
|
||||
struct Struct;
|
||||
impl Bar for Struct { /* stuff */ }
|
||||
fn foo() -> Foo {
|
||||
Struct
|
||||
}
|
||||
```
|
||||
|
||||
Any other "defining use site" needs to produce the exact same type.
|
||||
|
||||
## Defining use site(s)
|
||||
|
||||
Currently only the return value of a function can be a defining use site
|
||||
of an opaque type (and only if the return type of that function contains
|
||||
the opaque type).
|
||||
|
||||
The defining use of an opaque type can be any code *within* the parent
|
||||
of the opaque type definition. This includes any siblings of the
|
||||
opaque type and all children of the siblings.
|
||||
|
||||
The initiative for *"not causing fatal brain damage to developers due to
|
||||
accidentally running infinite loops in their brain while trying to
|
||||
comprehend what the type system is doing"* has decided to disallow children
|
||||
of opaque types to be defining use sites.
|
||||
|
||||
### Associated opaque types
|
||||
|
||||
Associated opaque types can be defined by any other associated item
|
||||
on the same trait `impl` or a child of these associated items. For instance:
|
||||
|
||||
```rust,ignore
|
||||
trait Baz {
|
||||
type Foo;
|
||||
fn foo() -> Self::Foo;
|
||||
}
|
||||
|
||||
struct Quux;
|
||||
|
||||
impl Baz for Quux {
|
||||
type Foo = impl Bar;
|
||||
fn foo() -> Self::Foo { ... }
|
||||
}
|
||||
```
|
||||
Loading…
Reference in New Issue