面试题答案
一键面试Rust中生成器基本概念
生成器是一种特殊的函数,它可以暂停和恢复执行,允许按需生成一系列值,而不是一次性计算并返回所有值。这在处理大型数据集或需要延迟计算的场景中很有用。生成器函数在执行过程中可以通过yield语句返回一个值并暂停执行,下次调用时从暂停的地方继续执行。
使用async
/await
模拟生成器示例代码
use std::pin::Pin;
use std::task::{Context, Poll};
use futures::future::Future;
// 定义一个生成器函数
async fn number_generator() {
for i in 0..10 {
// 模拟按需生成数据
println!("Generating number: {}", i);
futures::future::ready(()).await;
}
}
// 执行生成器
fn main() {
let mut gen = number_generator();
loop {
match Pin::new(&mut gen).poll(&mut Context::from_waker(&std::task::noop_waker())) {
Poll::Ready(_) => break,
Poll::Pending => std::thread::sleep(std::time::Duration::from_millis(100)),
}
}
}
说明
async
函数:async fn number_generator()
定义了一个异步函数,该函数内部模拟生成器行为。for
循环:在函数内部使用for
循环生成一系列数据,这里是从0到9的数字。await
:futures::future::ready(()).await;
语句模拟了暂停执行,允许生成器按需生成数据。每次执行到这里,函数暂停,下次恢复时从这里继续。- 执行生成器:在
main
函数中,通过Pin::new(&mut gen).poll
来手动驱动异步生成器的执行,当Poll::Ready
时表示生成器执行完毕,当Poll::Pending
时表示生成器暂停,这里通过std::thread::sleep
模拟按需获取数据的过程。