rust - 在Rust中,我创建了一个impl返回类型,可以将其作为参数传递。但是我没有找到将其存储在Struct中的方法吗?

标签 rust closures

我对此进行了细化,并更改为 channel ,这样可能更有意义。我想在我的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) {
在这里,我们正在创建它,并将其作为parameter传递。
        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) {
parameter被接受为test,那里没有问题。但是,如何在Struct中声明它,以便以后保存?
        self.test = test;
    }
}
正如我目前所声明的那样,它引发了编译器错误:
错误[E0562]:函数和固有方法返回类型之外不允许impl Trait我希望这是我做错事情的结果,而不是您不能在Struct中存储impl。我试过了:Arc<>Box<>,都无济于事。

最佳答案

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

  • fn make_test<T>(sender: Sender<T>) -> impl Fn()->bool {
    
    在返回位置,它的意思是“有一个特定的具体类型,但我没有写出来,它可能会改变,但肯定会实现Fn() -> bool”。需要返回裸闭包,否则它们具有无法命名的类型。 (如果可以编写闭包的类型,则必须指定所有闭包值的类型。)
  • fn parked(&mut self, test: impl Fn()->bool) {
    
    这是纯糖
    fn parked<T: impl Fn()->bool>(&mut self, test: T) {
    
    即,parked是通用函数。

  • 因此,您不能只拥有impl ...类型的struct字段,因为它不是具体类型。您可以做的事情与其他任何时候都拥有不止一种类型的事情相同:您可以编写带有类型参数的结构,
    struct MyParker<F: Fn() -> bool + 'static> {
        test: F,
    }
    
    但这不起作用,因为您不能将事物限制为未知的闭包类型-或可以编写包含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);
        }
    }
    
    请注意,为了存储Fn,我们需要提供生命周期限制。我在这里将其写为'static,但您也可以使用生命周期参数。
    但是,如果您想避免dyn友善 dispatch 的费用,最好用明确定义的结构和方法替换闭包-或(如果适用)(我没有查看您实际在做什么),只是将MyParker设为该结构,使其具有Sender<T>类型的字段。

    关于rust - 在Rust中,我创建了一个impl返回类型,可以将其作为参数传递。但是我没有找到将其存储在Struct中的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63748872/

    相关文章:

    javascript - NodeJS 闭包 - 循环对象数组并使用每个对象的数据 Ping 服务器

    struct - 为什么 sizeof::<Struct>() 不等于其字段大小的总和?

    rust - 要求特征实现可以相互转换

    rust - 自动将 &String 强制转换为 &str

    node.js - "Hello world"从 Chrome 而非 curl 测量时,Rust 网络服务器比 Node 慢

    javascript - 为什么这个 for/setTimeout() 代码实际上输出从 0 到 9 的数字?

    python - 嵌套函数中的局部变量

    rust - Rust 的确切自动解引用规则是什么?

    iOS Swift : Closures (Callbacks) versus Delegates, 什么时候使用哪个?

    循环内的 JavaScript 闭包 – 简单的实际示例