Rust 在《铁锈》中,我';我创建了一个impl返回类型,可以将其作为参数传递。但是我';我没有找到一种方法将它存储在我的结构中?

Rust 在《铁锈》中,我';我创建了一个impl返回类型,可以将其作为参数传递。但是我';我没有找到一种方法将它存储在我的结构中?,rust,closures,Rust,Closures,我已经将其细化并改为一个通道,这样可能会更有意义。我想存储一个impl,它是一个谓词函数,在我的Struct中,代码如下 从一个简单函数开始,该函数返回一个impl,用于测试某些内容 fn make_test<T>(sender: Sender<T>) -> impl Fn()->bool { let closure = move|| {sender.is_full()}; closure } struct MyStruct <T>

我已经将其细化并改为一个通道,这样可能会更有意义。我想存储一个
impl
,它是一个谓词函数,在我的
Struct
中,代码如下

从一个简单函数开始,该函数返回一个
impl
,用于测试某些内容

fn make_test<T>(sender: Sender<T>) -> impl Fn()->bool {
    let closure = move|| {sender.is_full()};
    closure
}

struct MyStruct <T> {
    sender: Sender<T>,
    parker: Arc<Mutex<MyParker>>,
}
impl<T> MyStruct<T> {
    fn something(&self) {
参数
被接受为
测试
,没有问题。但是如何在
结构中声明它,以便以后保存

        self.test = test;
    }
}
正如我目前声明的,它抛出一个编译器错误: 错误[E0562]:
impl Trait
在函数和固有方法返回类型之外不允许

我希望这是我做错了什么,而不是你不能在结构中存储
impl
。我试过:
Arc
Box
,都没有用。

“一个
impl
”不是一个类型。它或多或少是一个未命名类型(在返回值位置)或类型参数(在参数位置)的语法糖

  • 这是给你的纯糖

    fn parked<T: impl Fn()->bool>(&mut self, test: T) {
    
    但这不起作用,因为您不能将事物约束到未知的闭包类型,或者您可以编写一个包含
    dyn
    值的结构

    struct MyParker {
        test: Box<dyn Fn() -> bool + 'static>,
    }
    impl MyParker {
        fn parked(&mut self, test: impl Fn() -> bool + 'static) {
            self.test = Box::new(test);
        }
    }
    
    struct MyParker{
    测试:框bool+'静态>,
    }
    impl MyParker{
    fn驻车(&mut self,测试:impl fn()->bool+'静态){
    self.test=Box::new(测试);
    }
    }
    
    请注意,为了存储
    Fn
    ,我们需要提供一个生存期限制。我在这里把它写成了静态的,但是你也可以使用一个生存期参数


    但是,如果您想避免
    dyn
    amic分派的成本,最好用显式定义的结构和方法替换闭包,或者,如果适用(我没有看到您实际尝试做什么),只需将
    MyParker
    设置为该结构,使其具有类型为
    Sender

    的字段,谢谢您的详细解释。有了这些信息,我决定我可以在一个结构中包含必要的信息并将其交回,希望作为一个trait对象,它可以隐藏细节,同时公开测试方法。它还应该能够管理生命周期语义。
            let test = make_test(self.sender.clone());
            &self.parker.lock().unwrap().parked(test);
        }
    }
    
    
    struct MyParker {
        test: impl Fn()->bool,
    }
    impl MyParker {
        fn parked(&mut self, test: impl Fn()->bool) {
    
    fn parked<T: impl Fn()->bool>(&mut self, test: T) {
    
    struct MyParker<F: Fn() -> bool + 'static> {
        test: F,
    }
    
    struct MyParker {
        test: Box<dyn Fn() -> bool + 'static>,
    }
    impl MyParker {
        fn parked(&mut self, test: impl Fn() -> bool + 'static) {
            self.test = Box::new(test);
        }
    }