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