如何创建其他语言所称的惰性序列或"生成器"函数?

在Python中,我可以像下面的示例(来自Python的文档)一样使用yield来惰性地生成一个序列,该序列以一种不使用中间列表内存的方式进行迭代:

# a generator that yields items instead of returning a list
def firstn(n):
    num = 0
    while num < n:
        yield num
        num += 1

sum_of_first_n = sum(firstn(1000000))

我怎样才能在 rust 迹中做类似的事情?

推荐答案

Rust 1.0没有发电机功能,因此您必须手动使用explicit iterators.

首先,将Python示例重写为一个带有next()方法的类,因为这更接近于在Rust中可能得到的模型.然后你可以用一个实现Iterator特性的 struct 在Rust中重写它.

您也可以使用返回闭包的函数来实现类似的结果,但我认为不可能让它实现Iterator trait(因为需要调用它来生成新结果).

Rust相关问答推荐

为什么类型需要在这个代码中手动指定,在rust?

什么时候和为什么S最好是按值或引用传递简单类型

字段类型为Boxed的 struct 的生存期必须超过static

我应该将哪些文件放入我的GitHub存储库

如何初始化选项<;T>;数组Rust 了?

了解Rust';s特征对象和不同函数签名中的生存期注释

Tokio';s io::用Cursor拆分<;Vec<;u8>>;赢得';t get the full writted data

为相同特征的特征对象使用 move 方法实现特征

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

信号量释放后 Rust 输出挂起线程

为什么需要静态生命周期以及在处理 Rust 迭代器时如何缩小它?

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

从Rust 的临时文件中创建引用是什么意思?

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

为什么我可以同时传递可变和不可变引用?

使用 serde_json 进一步处理字段

用逗号分隔字符串,但在标记中使用逗号

如何在 nom 中构建负前瞻解析器?

TcpStream::connect - 匹配武器具有不兼容的类型

在 Rust 中退出进程