Я пытаюсь создать максимально простой пример, который может заставить async fn hello()
в конечном итоге распечатать Hello World!
.Это должно происходить без каких-либо внешних зависимостей, таких как tokio
, просто Rust и std
.Бонусные баллы, если мы сможем сделать это, даже не используя unsafe
.
#![feature(async_await)]
async fn hello() {
println!("Hello, World!");
}
fn main() {
let task = hello();
// Something beautiful happens here, and `Hello, World!` is printed on screen.
}
- Я знаю,
async/await
по-прежнему ночная функция, и она может измениться в обозримом будущем. - Я знаю, что существует множество реализаций
Future
, я знаю о существовании tokio
. - Я просто пытаюсь понять, как работают стандартные библиотечные фьючерсы.
Мои беспомощные, неуклюжие усилия
Мое смутное понимание состоит в том, что, во-первых, мне нужно Pin
выполнить задание.Итак, я пошел вперед и
let pinned_task = Pin::new(&mut task);
, но
the trait `std::marker::Unpin` is not implemented for `std::future::GenFuture<[static generator@src/main.rs:7:18: 9:2 {}]>`
, поэтому я подумал, конечно, что мне, вероятно, нужно Box
, так что я уверен, что он не будет двигатьсявокруг в памяти.Несколько удивительно, что я получаю ту же ошибку.
Что я мог бы получить, так это
let pinned_task = unsafe {
Pin::new_unchecked(&mut task)
};
, что, очевидно, не то, что я должен делать.Тем не менее, скажем, я взял в свои руки Pin
Нед Future
.Теперь мне нужно как-то poll()
.Для этого мне нужен Waker
.
Так что я попытался осмотреться, как достать Waker
.На doc это выглядит как единственный способ получить Waker
с другим new_unchecked
, который принимает RawWaker
.Оттуда я получил здесь и оттуда здесь , где я просто свернулся калачиком на полу и заплакал.