poll
имеет эту подпись:
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
Есть две проблемы с вызовом этого способа, как вы делаете:
poll
не внедряется в будущем Fut
, а в Pin<&mut Fut>
, поэтому сначала нужно получить закрепленную ссылку. pin_mut!
часто полезен, и если в будущем будет реализован Unpin
, вы также можете использовать Pin::new
.
Большая проблема, однако, заключается в том, что 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() {
// ...
}