【问题标题】:Arc<Mutex<dyn FnOnce(A) -> A>> for closure in RustArc<Mutex<dyn FnOnce(A) -> A>> 用于 Rust 中的闭包
【发布时间】:2022-01-22 06:44:33
【问题描述】:

我想创建一个结构,该结构有一个字段 mut_f,其中包含类型为 A -&gt; A 的可变线程安全函数(闭包)

对于初始化,值为identity闭包。

let identity = |a| a;

struct Foo<A> {
    mut_f: Arc<Mutex<dyn FnOnce(A) -> A>> 
}

let foo = Foo {
    mut_f: identity //error
};

这显然有错误:

让身份 = |a|一个;类型不匹配

预期结构std::sync::Arc,发现闭包

注意:预期结构 std::sync::Arc&lt;std::sync::Mutex&lt;(dyn std::ops::FnOnce(_) -&gt; _ + 'static)&gt;&gt; 找到闭包[closure@src/main.rs:36:20: 36:25] 帮助:使用括号调用此闭包:(a)rustc(E0308) main.rs(36, 20): 找到的闭包 main.rs(44, 17): 预期结构 std::sync::Arc, 发现关闭 没有可用的快速修复方法

基本上,我想让闭包定义尽可能简单,因为以后我需要以函数组合的方式组合另一个函数(闭包)。

所以我的问题是将 Cast 闭包转换为 Arc&lt;Mutex&lt;dyn FnOnce(A) -&gt; A&gt;&gt; 类型的充分/智能方法是什么?

【问题讨论】:

  • stackoverflow.com/questions/27831944/… 会回答您的问题吗? (接受的答案有一个盒装闭包的例子)
  • 实际上是的,我已经看到了答案,但没有注意到Arc::new(Mutex::new(identity)) 是确切的答案,所以如果您发布答案,我会接受。功劳是你的。谢谢!

标签: rust


【解决方案1】:

Foo 期待 Arc&lt;Mutex&lt;dyn FnOnce&gt;&gt;,所以如果你只传递一个闭包,你就会得到那个错误。你可以通过构建 Arc 和 Mutex 来解决这个问题:

let foo = Foo {
    mut_f: Arc::new(Mutex::new(identity))
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2020-05-09
    • 2022-09-23
    • 2019-10-27
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多