Adr*_*des 1 future rust rust-tokio
不知道如何处理这里的借用检查器。
use tokio::sync::oneshot; // 1.0.2
fn main() {
let (sender, receiver) = oneshot::channel::<u8>();
tokio::spawn(async move {
loop {
sender.send(3).unwrap();
}
});
}
Run Code Online (Sandbox Code Playgroud)
创建此错误:
error[E0382]: use of moved value: `sender`
--> src/main.rs:7:13
|
7 | sender.send(3).unwrap();
| ^^^^^^ value moved here, in previous iteration of loop
|
= note: move occurs because `sender` has type `tokio::sync::oneshot::Sender<u8>`, which does not implement the `Copy` trait
Run Code Online (Sandbox Code Playgroud)
你不知道。这就是一次性通道的全部要点:它最多只能使用一次:
\n\n\n用于在异步任务之间发送单个消息的通道。
\n\xe2\x80\x94
\ntokio::sync::oneshot
听起来您想要一种不同类型的频道,例如tokio::sync::mpsc
.
\n\n如果我只想在循环开始时发送一条消息怎么办?
\n
然后执行循环开始前的代码:
\nuse tokio::sync::oneshot; // 1.0.2\n\nfn main() {\n let (sender, receiver) = oneshot::channel::<u8>();\n tokio::spawn(async move {\n sender.send(3).unwrap();\n \n loop {\n // Do things\n }\n });\n}\n
Run Code Online (Sandbox Code Playgroud)\n如果必须将其放在循环内,则需要动态地将值标记为不再存在并处理这种情况。在这里,我使用Option
and if let
:
use tokio::sync::oneshot; // 1.0.2\n\nfn main() {\n let (sender, receiver) = oneshot::channel::<u8>();\n tokio::spawn(async move {\n let mut sender = Some(sender);\n \n loop {\n if let Some(sender) = sender.take() {\n sender.send(3).unwrap();\n }\n // Do things\n }\n });\n}\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
5726 次 |
最近记录: |