gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:27:19 25 4
gpt4 key购买 nike

我有关闭:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com