Update E0706.md
This commit is contained in:
parent
e565329144
commit
846f5e6bb9
1 changed files with 6 additions and 6 deletions
|
@ -1,4 +1,4 @@
|
||||||
`async fn`s are not yet supported in Rust.
|
`async fn`s are not yet supported in traits in Rust.
|
||||||
|
|
||||||
Erroneous code example:
|
Erroneous code example:
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ trait T {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
`async fn`s normally return an `impl Future`, making the following two examples equivalent:
|
`async fn`s return an `impl Future`, making the following two examples equivalent:
|
||||||
|
|
||||||
```edition2018,ignore (example-of-desugaring-equivalence)
|
```edition2018,ignore (example-of-desugaring-equivalence)
|
||||||
async fn foo() -> User {
|
async fn foo() -> User {
|
||||||
|
@ -23,7 +23,7 @@ fn foo(&self) -> impl Future<Output = User> + '_ {
|
||||||
```
|
```
|
||||||
|
|
||||||
But when it comes to supporting this in traits, there are [a few implementation
|
But when it comes to supporting this in traits, there are [a few implementation
|
||||||
issues][async-is-hard], one of which is that returning `impl Trait` in traits is not supported,
|
issues][async-is-hard]. One of them is returning `impl Trait` in traits is not supported,
|
||||||
as it would require [Generic Associated Types] to be supported:
|
as it would require [Generic Associated Types] to be supported:
|
||||||
|
|
||||||
```edition2018,ignore (example-of-desugaring-equivalence)
|
```edition2018,ignore (example-of-desugaring-equivalence)
|
||||||
|
@ -40,8 +40,8 @@ impl MyDatabase {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Until these issues are resolved, you can use the [`async-trait` crate], which allows you to use
|
Until these issues are resolved, you can use the [`async-trait` crate], allowing you to use
|
||||||
this feature by sidesteping the language feature issue by desugaring to "boxed futures"
|
`async fn` in traits by desugaring to "boxed futures"
|
||||||
(`Pin<Box<dyn Future + Send + 'async>>`):
|
(`Pin<Box<dyn Future + Send + 'async>>`):
|
||||||
|
|
||||||
```edition2018,ignore (example-of-desugaring-equivalence)
|
```edition2018,ignore (example-of-desugaring-equivalence)
|
||||||
|
@ -75,4 +75,4 @@ You might be interested in visiting the [async book] for further information.
|
||||||
[`async-trait` crate]: https://crates.io/crates/async-trait
|
[`async-trait` crate]: https://crates.io/crates/async-trait
|
||||||
[async-is-hard]: https://smallcultfollowing.com/babysteps/blog/2019/10/26/async-fn-in-traits-are-hard/
|
[async-is-hard]: https://smallcultfollowing.com/babysteps/blog/2019/10/26/async-fn-in-traits-are-hard/
|
||||||
[Generic Associated Types]: https://github.com/rust-lang/rust/issues/44265
|
[Generic Associated Types]: https://github.com/rust-lang/rust/issues/44265
|
||||||
[async book]: https://rust-lang.github.io/async-book/07_workarounds/06_async_in_traits.html
|
[async book]: https://rust-lang.github.io/async-book/07_workarounds/06_async_in_traits.html
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue