我有关闭:
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
是一个引用,这将导致它被复制到闭包中,然后需要底层的 Sender
要Sync
的对象。
要将一个 mpsc Sender
发送到另一个线程,您需要先克隆它,然后将克隆移动到闭包中:
{
let sender = sender.clone();
move |p| match Params::parse::<Value>(p) {
...
}
};
关于asynchronous - `move` 在闭包中不克隆数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44043643/