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

标签 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)

最佳答案

Yes, I am aware that this is an unstable feature

不稳定的功能往往会随着时间的推移而改变,情况就是如此。随着最近 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(你的代码丢失了,因此不应该在较旧的 nightly 上编译),这就是为什么 Pin 已为生成器选择 API。

经验教训:如果您使用夜间编译器,还可以使用 nightly doc .

关于rust - 生成器似乎没有公开 `resume()` 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55576401/

相关文章:

python - 如何切片生成器对象或迭代器?

python - 如何循环通过生成器

memory-management - 借用检查值进出结构字段?

rust - 使用反序列化时是否可以自动忽略结构字段

python - 重写一个函数,该函数创建具有固定总和的数字组合作为生成器

macos - 阻止我的 Cocoa 应用程序出现 "Resume"?

c - C 中的暂停和恢复循环

ios - 在 iPhone 上继续中断的下载

winapi - 为什么在将 EvtQuery 与 winapi crate 一起使用时会出现 ERROR_INVALID_PARAMETER?

rust - GTK4 : How to specify rows and columns of a GtkGrid object within a GtkBuilder ui file