Reference 是否可以通过电弧<;RwLock<&;Fn()>&燃气轮机;不使用类型参数的函数?
我必须将Reference 是否可以通过电弧<;RwLock<&;Fn()>&燃气轮机;不使用类型参数的函数?,reference,rust,trait-objects,Reference,Rust,Trait Objects,我必须将弧传递给函数: use std::sync::{Arc, RwLock}; fn main() { let closure = || println!("Hello World"); let wrapped_closure = Arc::new(RwLock::new(&closure)); execute(wrapped_closure); } fn execute(f: Arc<RwLock<&Fn()>>) {
弧
传递给函数:
use std::sync::{Arc, RwLock};
fn main() {
let closure = || println!("Hello World");
let wrapped_closure = Arc::new(RwLock::new(&closure));
execute(wrapped_closure);
}
fn execute(f: Arc<RwLock<&Fn()>>) {
let rw_lock_read_guard = f.read().unwrap();
(rw_lock_read_guard)()
}
这也是可行的,但是我也不能使用where子句(因为我需要在结构中使用where子句,但是在结构中没有where子句)
弧
并删除函数签名中的一个与。这正是我需要的,但它也失败了包裹的_闭包
铸造成弧
(这是类似问题的解决方案)。这失败了,因为它是“非原始类型”是否可以在Rust中传递
弧
,而不添加类型参数和where子句?如果是,如何解决?解决方案由Shepmaster提供,并取自评论
诀窍是将闭包引用转换为
&Fn
,将Arc::new(RwLock::new(&closure))
替换为Arc::new(RwLock::new(
)
解决方案由Shepmaster提供并从注释中获取
技巧是将闭包引用强制转换为
&Fn
,将Arc::new(RwLock::new(&closure))
替换为Arc::new(RwLock::new(
)
欢迎使用堆栈溢出!我相信你的问题得到了我的回答。TL;DR:Box::新建(&closure as&Fn())
。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。&closure为&Fn()
,而不是整个类型。@Shepmaster。好的,它起作用了。但是现在我只传递了&Fn(),尽管execute()也需要它周围的所有包装器。还是我误解了什么?let wrapped_closure=Arc::new(RwLock::new(&closure as&Fn())
我认为
是一个偶然的错误,不是问题的一部分,所以我删除了它并编辑了标题,以便更清楚地了解这个问题,因为我真的不认为它与where
子句有关。如果您认为我的编辑不符合原始问题的精神,请随意重新编辑。欢迎使用堆栈溢出!我相信你的问题得到了我的回答。TL;DR:Box::新建(&closure as&Fn())
。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。&closure为&Fn()
,而不是整个类型。@Shepmaster。好的,它起作用了。但是现在我只传递了&Fn(),尽管execute()也需要它周围的所有包装器。还是我误解了什么?let wrapped_closure=Arc::new(RwLock::new(&closure as&Fn())
我认为
是一个偶然的错误,不是问题的一部分,所以我删除了它并编辑了标题,以便更清楚地了解这个问题,因为我真的不认为它与where
子句有关。如果你认为我的编辑不符合原始问题的精神,请随意重新编辑。
fn execute(f: Arc<RwLock<&F>>) where F: Fn() { /* ... */ }