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