生成器似乎没有公开`resume()`方法

时间:2019-04-08 15:03:29

标签: rust generator resume

我正在查看generators in Rust,并决定尝试一下。我实现了我可以找到的最基本的示例:

#![feature(generators, generator_trait)]

use std::ops::Generator;

fn main() {
    let mut generator = || {
        println!("2");
        yield;
        println!("4");
    };

    println!("1");
    generator.resume();
    println!("3");
    generator.resume();
    println!("5");
}

但是,当我尝试编译时,出现此错误:

error[E0599]: no method named `resume` found for type `[generator@src/main.rs:6:25: 10:6 _]` in the current scope
  --> src/main.rs:13:15
   |
13 |     generator.resume();
   |               ^^^^^^

我做错什么了吗,或者resume()方法实际上在生成器上不存在?如果是这样,如何唤醒发电机?我能找到所有指向resume()方法的文档,所以现在我很困惑。

注意:是的,我知道这是该语言的不稳定功能,但是在文档上确实鼓励用户尝试使用它,所以我认为至少应该部分实施?

我当前的环境rustc 1.35.0-nightly (acd8dd6a5 2019-04-05)

1 个答案:

答案 0 :(得分:3)

  

是的,我知道这是一个不稳定的功能

不稳定的功能往往会随着时间而改变,这是事实。随着Pin最近的稳定,resume的签名已更改(PR #55704

fn resume(self: Pin<&mut Self>) -> GeneratorState<Self::Yield, Self::Return>;

但幸运的是,这些示例也有been adopted

因此您的代码需要如下所示:

#![feature(generators, generator_trait)]

use std::ops::Generator;
use std::pin::Pin;

fn main() {
    let mut generator = || {
        println!("2");
        yield;
        println!("4");
    };

    let mut pin = Pin::new(&mut generator);
    println!("1");
    pin.as_mut().resume();
    println!("3");
    pin.as_mut().resume();
    println!("5");
}

这样做的好处是,该方法不再需要unsafe(您的代码丢失了,因此不应在较晚的夜间进行编译),这就是为什么选择Pin API的原因用于发电机。

经验教训:如果您使用夜间编译器,请同时使用nightly doc