asynchronous - `move` 在闭包中不克隆数据

标签 asynchronous rust closures

我有关闭:

move |p| match Params::parse::<Value>(p) {
            Ok(ref v) if v.as_str().is_some() => {
                let chain = v.as_str().unwrap();
                match sender.send(chain) {
                    Ok(_) => futures::done(Ok(Value::Null)).boxed(),
                    Err(err) => futures::failed(JsonRpcError::invalid_params(
                        format!("Node not responding: {}", err.to_string())))
                        .boxed(),
                }
            }
            Ok(_) | Err(_) => {
                futures::failed(JsonRpcError::invalid_params("Invalidlabel"))
                    .boxed()
            }
        };

编译失败并出现这样的错误:

the trait bound `std::sync::mpsc::Sender<&str>: std::marker::Sync` is not satisfied in `[closure@src/rpc/mod.rs:223:13: 237:14 sender:std::sync::mpsc::Sender<&str>]`

难道 move 关键字不应该捕获并克隆 Sender 吗?

最佳答案

move 关键字导致 Sender 对象move 到闭包中,即它专门设计用于防止发生借用。您的错误消息表明 sender 不是 Sync,这表明实际上并未发生移动。正如 @red75prim 所指出的,发生这种情况的一种方法是如果 sender 是一个引用,这将导致它被复制到闭包中,然后需要底层的 SenderSync 的对象。

要将一个 mpsc Sender 发送到另一个线程,您需要先克隆它,然后将克隆移动到闭包中:

{
    let sender = sender.clone();
    move |p| match Params::parse::<Value>(p) {
        ...
    }
};

关于asynchronous - `move` 在闭包中不克隆数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44043643/

相关文章:

c# - 后台任务中的异步调用不起作用

rust - 为什么借用的范围不是迭代器,但范围是?

rust - 如何减少可变范围

swift - 使用 "self."前缀和在闭包的捕获列表中写入 "self"有什么区别?

闭包 : help me understand 的 JavaScript 作用域

javascript - 这是否符合 Javascript 闭包的条件?

c# - 异步方法不返回 asp.net mvc 4

javascript - geolocation.getCurrentPosition 如何返回值?

javascript - 有没有办法在 Node.js 中强制执行同步函数调用?

multithreading - 了解 Rust channel 。 `send` 如何工作?