Rust: метод «poll» не найден в `impl std :: future :: Future` - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь научиться асинхронному c программированию, но этот базовый c пример не работает:

use std::future::Future;

fn main() {
    let t = async {
        println!("Hello, world!");
    };
    t.poll();
}

Все, что я прочитал из спецификаций, говорит, что это должно работать, но машина go жалуется, что метод "poll" не найден в "impl std :: future :: Future". Что я делаю не так?

1 Ответ

2 голосов
/ 21 апреля 2020

poll имеет эту подпись:

fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;

Есть две проблемы с вызовом этого способа, как вы делаете:

  1. poll не внедряется в будущем Fut, а в Pin<&mut Fut>, поэтому сначала нужно получить закрепленную ссылку. pin_mut! часто полезен, и если в будущем будет реализован Unpin, вы также можете использовать Pin::new.

  2. Большая проблема, однако, заключается в том, что poll принимает аргумент &mut <a href="https://doc.rust-lang.org/stable/std/task/struct.Context.html" rel="nofollow noreferrer">Context</a><'_>. Контекст создается асинхронной средой выполнения и передается в функцию poll самого отдаленного будущего. Это означает, что вы не можете просто опрашивать будущее таким образом, вам нужно быть в асинхронной среде выполнения, чтобы сделать это.

Вместо этого вы можете использовать ящик типа tokio или async-std для запуска будущего в синхронном контексте:

// tokio
use tokio::runtime::Runtime;
let runtime = Runtime::new().unwrap();
let result = runtime.block_on(async {
  // ...
});

// async-std
let result = async_std::task::block_on(async {
  // ...
})

Или даже лучше, вы можете использовать #[tokio::main] или #[async_std::main] для преобразования вашей main функции в асинхронную функцию:

// tokio
#[tokio::main]
async fn main() {
  // ...
}

// async-std
#[async_std::main]
async fn main() {
  // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...