MST
星途 面试题库

面试题:Rust生成器基础实现

请简述Rust中生成器的基本概念,并给出一个简单的使用`async`/`await`语法来模拟生成器的代码示例,说明如何使用生成器按需生成一系列数据。
45.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

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)),
        }
    }
}

说明

  1. async函数async fn number_generator()定义了一个异步函数,该函数内部模拟生成器行为。
  2. for循环:在函数内部使用for循环生成一系列数据,这里是从0到9的数字。
  3. awaitfutures::future::ready(()).await;语句模拟了暂停执行,允许生成器按需生成数据。每次执行到这里,函数暂停,下次恢复时从这里继续。
  4. 执行生成器:在main函数中,通过Pin::new(&mut gen).poll来手动驱动异步生成器的执行,当Poll::Ready时表示生成器执行完毕,当Poll::Pending时表示生成器暂停,这里通过std::thread::sleep模拟按需获取数据的过程。