String 如何在Rust(横梁)中与多个生产者和单个接收者共享字符串消息?

String 如何在Rust(横梁)中与多个生产者和单个接收者共享字符串消息?,string,multithreading,rust,channel,String,Multithreading,Rust,Channel,我有一个项目,其中多个线程将以字符串格式传输读数,我希望它们由一个处理程序线程使用 不幸的是,字符串没有实现复制/克隆,因此我无法传递我的横梁通道的引用,因此第二个线程不会得到错误 --> src/main.rs:71:30 | 61 | let (tx_ws, rx_ws) = unbounded(); | --------- move occurs because `tx_ws` has type `crossbeam::Sender<node::Web

我有一个项目,其中多个线程将以字符串格式传输读数,我希望它们由一个处理程序线程使用

不幸的是,字符串没有实现复制/克隆,因此我无法传递我的横梁通道的引用,因此第二个线程不会得到错误

--> src/main.rs:71:30
|
61 |     let (tx_ws, rx_ws) = unbounded();
|          --------- move occurs because `tx_ws` has type `crossbeam::Sender<node::WebsocketResponse>`, which does not implement the `Copy` trait
...
70 |     let node0_thread = thread::spawn(move || node0::run(Some(&n0_settings), tx_ws.clone()));
|                             ------- value moved into closure here                   --------- variable moved due to use in closure
71 |     let node1_thread = thread::spawn(move || node1::run(Some(&n1_settings), tx_ws.clone()));
|                              ^^^^^^^ value used here after move                  --------- use occurs due to use in closure

-->src/main.rs:71:30
|
61 | let(tx_-ws,rx_-ws)=无界();
|------发生移动是因为'tx_ws'具有'crossbeam::Sender'类型,该类型未实现'Copy'特性
...
70 |让node0|u线程=线程::繁殖(移动| | node0::运行(一些(&n0|设置),tx|ws.clone());
|------值移到此处的闭包中------变量因在闭包中使用而移动
71 |让节点1|u线程=线程::繁殖(移动| |节点1::运行(一些(&n1_设置),tx|ws.clone());
|^^^^^^^移动后此处使用的值------由于在闭包中使用而发生使用
你们要耍什么花招?我知道String是一种非装箱类型,但不知道如何绕过它


有没有其他方法可以通过横梁通道发送类似字符串的消息?

您正在使用
move
闭包,它尝试将任何捕获的变量移入,并且您在同一个变量(
tx_ws
)上两次将其移入不同的闭包中

如果
Sender
Copy
,这将很好,它将被自动复制,但因为它只是
Clone
,所以需要显式克隆它。您试图调用
clone()
,但是在闭包内部(因此在移动发生之后),这已经太晚了

在第61行之后,添加一行,如:
让tx_ws_clone=tx_ws.clone()

并将其中一个闭包更改为使用
tx\u ws\u clone
而不是
tx\u ws
,这样事情就应该开始工作了。在闭包内部,您不需要克隆
tx_ws
;您只需在移动前克隆它:)

String确实实现了
clone
btw。请下次添加代码,并确保复制粘贴错误消息,因为它现在没有格式化,所有重要的错误信息都已消失。