为可执行的闭包创建线程安全的包装器

时间:2019-05-18 18:07:23

标签: rust closures type-parameter

我想要一个任意输入F,它返回一个任意值Z。从API角度来看,我想要这样的东西:

let mut action = ExecutableAction::create(move || {
    true
});

在这种情况下,Zbool的实例,而F是返回Z的函数。

我尝试了以下代码:

use std::sync::{Arc, Mutex};

pub struct ExecutableAction<F, Z>
where
    F: FnMut() -> Z + Send + Sync,
{
    action: Arc<Mutex<Box<F>>>,
}

impl<F, Z> ExecutableAction<F, Z>
where
    F: FnMut<()> + Send + Sync,
    Z: Send + Sync,
{
    pub fn create(closure: F) -> Self
    where
        F: FnMut() -> Z + Send + Sync,
    {
        Self {
            action: Arc::new(Mutex::new(closure)),
        }
    }

    pub fn call(&mut self) -> Z {
        self.action.lock().call()
    }
}
error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead (see issue #29625)
  --> src/lib.rs:12:8
   |
12 |     F: FnMut<()> + Send + Sync,
   |        ^^^^^^^^^

我确定我的语法已关闭,因为它无法编译。我如何才能使它普遍适用?另外,用类型参数F表示R的参数又如何呢?怎么在这里添加?

0 个答案:

没有答案