Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 为什么一个值在函数的循环中存在的时间足够长,而在tokio::spawn的直接代码中却没有?_Function_Rust_Borrow Checker - Fatal编程技术网

Function 为什么一个值在函数的循环中存在的时间足够长,而在tokio::spawn的直接代码中却没有?

Function 为什么一个值在函数的循环中存在的时间足够长,而在tokio::spawn的直接代码中却没有?,function,rust,borrow-checker,Function,Rust,Borrow Checker,我在理解tokio 0.2中使用tokio:spawn的循环中的移动值时遇到一些困难。我尝试将一个一次性接收器传递给一个listen函数,该函数在循环中使用超时周期性地检查它 奇怪的是,当我在tokio::spawn中使用一个单独的函数listen时,这就起作用了。但是,当我在tokio::spawn闭包中从该函数复制代码时,它不会编译,抱怨值在上一个循环中移动了(我有点理解)。那么,为什么它在函数版本中工作 以下是工作版本的示例: 使用std::time::Duration; 使用东京:{sy

我在理解tokio 0.2中使用tokio:spawn的循环中的移动值时遇到一些困难。我尝试将一个一次性接收器传递给一个listen函数,该函数在循环中使用超时周期性地检查它

奇怪的是,当我在
tokio::spawn
中使用一个单独的函数
listen
时,这就起作用了。但是,当我在
tokio::spawn
闭包中从该函数复制代码时,它不会编译,抱怨值在上一个循环中移动了(我有点理解)。那么,为什么它在函数版本中工作

以下是工作版本的示例:

使用std::time::Duration;
使用东京:{sync::oneshot,future::futurext,timer::delay_for};
发布异步fn a(){
let(停止发送方,多停止接收方)=oneshot::channel::();
东京:产卵(异步移动){
侦听(&mut stop_接收器)。等待;
});
延迟(持续时间::新(1,0))。等待;
停止发送程序。发送(true)。展开();
}    
异步fn侦听(停止接收器:&mut oneshot::接收器){
环路{
匹配停止\接收器。超时(持续时间::从\秒(1))。等待{
Ok(无超时)=>匹配无超时{
Ok(停止)=>
如果停止{
println!(“接收到正确的停止信号”);
打破
},
Err()=>(),//不要停止
},
Err()=>(),//超时
}
}
}
#[tokio::main]
异步fn main(){
等待;
延迟(持续时间:新的(2,0))。等待;
}
以下操作不起作用:

使用std::time::Duration;
使用东京:{sync::oneshot,future::futurext,timer::delay_for};
发布异步fn b(){
let(停止发送方,多停止接收方)=oneshot::channel::();
东京:产卵(异步移动){
环路{
匹配停止\接收器。超时(持续时间::从\秒(1))。等待{
Ok(无超时)=>匹配无超时{
Ok(停止)=>
如果停止{
println!(“接收到正确的停止信号”);
打破
},
Err()=>(),//不要停止
},
Err()=>(),//超时
}
}
});
延迟(持续时间::新(1,0))。等待;
停止发送程序。发送(true)。展开();
}    
#[tokio::main]
异步fn main(){
等待;
延迟(持续时间:新的(2,0))。等待;
}
当我删除超时时,它在函数版本中也不起作用(错误:在循环的上一次迭代中移动了值)。为什么会这样,也就是说,为什么它在有超时的函数版本中实际工作?
不幸的是,我无法用以前关于循环中移动值的答案来解释。也许有人能解释一下。谢谢

您的工作版本有很多错误,请添加,答案可能是,您正在使用
异步移动
移动
stop\u receiver
,您需要借用(这与第一个不同)我添加了两个完整的代码示例。我仍然不明白,因为在这两个版本中我都使用异步移动。特别是如果我删除版本a中的超时,它将不再工作,但为什么?您能否告诉我如何删除超时?无需修改问题,您只需在游乐场上添加即可。以下是不带超时的函数:
rust async fn listen(stop_receiver:&mut oneshot::receiver){loop{match stop_receiver.wait{Ok(stop)=>if stop{println!(“已接收到停止信号true”);break;},Err=>(),//不停止},}}}