gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:37:01 24 4
gpt4 key购买 nike

我对此进行了细化,并更改为 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com