我正在编写一个使用生成器保存延续的库。有时候我想传递一个没有暂停点或没有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=()>`
答案 0 :(得分:4)
闭包不是生成器,因此编译器不能真正将其视为一个生成器。目前尚不清楚您希望实现的生成器是应该返回函数的返回值还是返回结果。假设您希望使用前者,则可以在Temperature::initialize
语句之后使用.ned
语句来创建不产生的生成器:
yield
如果您经常需要此功能,也可以将其包装在一个函数中:
return