Rust 如何将没有屈服的闭包转换为生成器?
我正在写一个库,它使用生成器来保存连续体。有时我希望传递一个没有挂起点的闭包,或者没有Rust 如何将没有屈服的闭包转换为生成器?,rust,closures,generator,Rust,Closures,Generator,我正在写一个库,它使用生成器来保存连续体。有时我希望传递一个没有挂起点的闭包,或者没有yields,但是编译器抱怨闭包没有实现Generator特性 我想编译以下代码,而不向闭包添加yield;如何让编译器将闭包视为生成器 #![feature(generators, generator_trait)] use std::ops::Generator; fn library_func(mut g: Box<dyn Generator<Yield = (), Return = ()
yield
s,但是编译器抱怨闭包没有实现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);
}
#![特征(发电机、发电机特性)]
使用std::ops::Generator;
fn library_func(mut g:Box){
设x=unsafe{g.resume()};
println!(“{:?}”,x);
}
fn main(){
//无果而终
设x=Box::new(| |){
//取消对此行的注释会使其编译,但会更改其行为
//收益率();
});
图书馆职能(x);
}
error[E0277]:特征绑定`[closure@src/main.rs:12:22:15:6]:std::ops::Generator`不满足
-->src/main.rs:17:18
|
17 |图书馆(x);;
|^std::ops::Generator特性未为实现`[closure@src/main.rs:12:22:15:6]`
|
=注意:强制转换到对象类型'dyn std::ops::Generator'时需要`
闭包不是生成器,因此编译器不能真正将其视为生成器。不清楚您希望实现的生成器是应该返回还是产生函数的返回值;假设需要前者,可以在return
语句之后使用yield
语句来创建不产生以下结果的生成器:
let x = Box::new(|| {
return;
yield;
});
如果您经常需要,也可以将其包装到函数中:
fn into_generator<F, T>(f: F) -> impl Generator<Yield = (), Return = T>
where
F: FnOnce() -> T,
{
#[allow(unreachable_code)]
|| {
return f();
yield;
}
}
fn插入_生成器(f:f)->impl生成器
哪里
F:FnOnce()->T,
{
#[允许(无法访问的_代码)]
|| {
返回f();
产量
}
}
()是否可以定义一种转换特性,如
到迭代器
,自动调用到函数的\u生成器
?我尝试了这个方法,但遇到了冲突的实现错误:我知道有冲突的可能性,但我找不到解决办法。@pandaman我看不到一个好方法来实现所有生成器和所有闭包的特性。通常只有一个总体实现,因为无法排除实现这两个特性的类型。显式转换函数作为一种解决方案似乎并不太糟糕,尽管我不了解您的用例。我正在为Rust编写一个代数效果库,而闭包的实际发生情况就在其中。因此,如果我能以语法等效的方式处理生成器和函数,那就太好了。@pandaman有些情况下,可以使用板条箱专用的“密封”特性来解决实现之间的冲突,因此下游板条箱无法实现这些特性–例如,请参阅和。然而,我不认为这种模式可以在这里应用,因为我们不能真正阻止下游板条箱为同一类型同时实现……FnOnce
和Generator
。