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);
}
}