Rust does有发电机,但它们是高实验,目前无法稳定地在Rust。
Works in stable Rust 1.0 and above
rel=“noreferer”>处理你的具体例子。 您可使用<条形状糖>。
fn main() {
let sum: u64 = (0..1_000_000).sum();
println!("{}", sum)
}
What if Range
didn t exist? We can create an iterator that models it!
struct MyRange {
start: u64,
end: u64,
}
impl MyRange {
fn new(start: u64, end: u64) -> MyRange {
MyRange {
start: start,
end: end,
}
}
}
impl Iterator for MyRange {
type Item = u64;
fn next(&mut self) -> Option<u64> {
if self.start == self.end {
None
} else {
let result = Some(self.start);
self.start += 1;
result
}
}
}
fn main() {
let sum: u64 = MyRange::new(0, 1_000_000).sum();
println!("{}", sum)
}
这些口号相同,但比灰色版本更明确。 值得注意的是,斯堪的发电机为你跟踪国家。 选择明确性,因此我们必须建立自己的国家,并以人工更新。 重要部分是执行Iterator
trait。 我们具体规定,电梯产生某种特定类型的数值(,type 项目 = u64
),然后处理每一频率的升值以及如何告诉我们已经到了绝缘状态。
这个例子并不像使用通用物的实际<代码>Range那样强大,而是显示了如何做到这一点的榜样。
Works in nightly Rust
夜晚会:does有的发电机,但它们是高实验性。 你们需要找到一些不稳定的特征来创造这种特征。 然而,它看见pretty靠近沙尔的例子,加上一些与Rust有关的内容:
// 1.43.0-nightly (2020-02-09 71c7e149e42cb0fc78a8)
#![feature(generators, generator_trait)]
use std::{
ops::{Generator, GeneratorState},
pin::Pin,
};
fn firstn(n: u64) -> impl Generator<Yield = u64, Return = ()> {
move || {
let mut num = 0;
while num < n {
yield num;
num += 1;
}
}
}
A. 现有一切 Rust在探测器上运行,我们创建了一个适应器,把发电机变成一个发电机,以便在更广泛的生态系统中发挥作用。 d 我预计,这一改编者最终将出席标准图书馆:
struct GeneratorIteratorAdapter<G>(Pin<Box<G>>);
impl<G> GeneratorIteratorAdapter<G>
where
G: Generator<Return = ()>,
{
fn new(gen: G) -> Self {
Self(Box::pin(gen))
}
}
impl<G> Iterator for GeneratorIteratorAdapter<G>
where
G: Generator<Return = ()>,
{
type Item = G::Yield;
fn next(&mut self) -> Option<Self::Item> {
match self.0.as_mut().resume(()) {
GeneratorState::Yielded(x) => Some(x),
GeneratorState::Complete(_) => None,
}
}
}
我们现在可以这样做:
fn main() {
let generator_iterator = GeneratorIteratorAdapter::new(firstn(1_000_000));
let sum: u64 = generator_iterator.sum();
println!("{}", sum);
}
令人感兴趣的是,它比执行<代码>Iterator的力量要小。 例如,激光器有size_hint
,使电离层的消费者能够了解有多少元素。 这使得在进入集装箱时能够优化<代码> 集体代码>。 发电机没有任何此类信息。