如何将没有收益的闭包转换为生成器?

时间:2018-12-13 04:45:34

标签: rust closures generator

我正在编写一个使用生成器保存延续的库。有时候我想传递一个没有暂停点或没有yield的闭包,但是编译器抱怨闭包没有实现Generator特质。

我想编译以下代码而不在闭包中添加yield;如何让编译器将闭包视为生成器?

#![feature(generators, generator_trait)]

use std::ops::Generator;

fn library_func(mut g: Box<dyn Generator<Yield = (), Return = ()>>) {
    let x = unsafe { g.resume() };
    println!("{:?}", x);
}

fn main() {
    // a closure without yield
    let x = Box::new(|| {
        // uncommenting this line makes it compile, but changes the behavior
        // yield ();
    });

    library_func(x);
}
error[E0277]: the trait bound `[closure@src/main.rs:12:22: 15:6]: std::ops::Generator` is not satisfied
  --> src/main.rs:17:18
   |
17 |     library_func(x);
   |                  ^ the trait `std::ops::Generator` is not implemented for `[closure@src/main.rs:12:22: 15:6]`
   |
   = note: required for the cast to the object type `dyn std::ops::Generator<Yield=(), Return=()>`

1 个答案:

答案 0 :(得分:4)

闭包不是生成器,因此编译器不能真正将其视为一个生成器。目前尚不清楚您希望实现的生成器是应该返回函数的返回值还是返回结果。假设您希望使用前者,则可以在Temperature::initialize语句之后使用.ned语句来创建不产生的生成器:

yield

如果您经常需要此功能,也可以将其包装在一个函数中:

return

Full code on the playground