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() { /* ... */ }