我无法理解tokio::try_run!返回tokio::spawn. Err当我运行以下示例时:
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
let h1 = tokio::spawn(async {
sleep(Duration::from_millis(100)).await;
// 1/0; commented for now
let v: Result<i32, ()> = Err(());
v
});
let h2 = tokio::spawn(async {
sleep(Duration::from_millis(500)).await;
println!("h2 didn't get canceled");
let v: Result<i32, ()> = Ok(2);
v
});
match tokio::try_join!(h1, h2) {
Ok((first, second)) => {
println!("try_join was successful, got {:?} and {:?}", first, second);
}
Err(err) => {
println!("try_join had an error: {:?}", err);
} …Run Code Online (Sandbox Code Playgroud) 我正在寻找中断无限迭代器迭代的方法。我发现这try_fold达到了我的目标。然而,这需要Err在成功的案例上做返回一个尴尬的事情。我想了解的是,这是否是一种惯用的做事方式。我能想到的唯一另一种方法是使用常规的for,或者像findwhile 保持外部状态的东西(感觉更奇怪!)。我知道在 clojure 中有reduced,但我找不到 rust 的等价物。
这是一个最小可行的例子。该示例围绕初始 Vec 循环,对每个项目进行求和,并在第一个大于 10 的总和处停止。即它返回 12,因为1 + 5 - 3 + 1 + 5 - 3 + 1 + 5 = 12:
fn main() {
let seed = vec![1, 5, -3];
let res = seed.iter().cycle().try_fold(0, |accum, value| {
let next = accum + value;
if next > 10 {
Err(next)
} else {
Ok(next)
}
});
if let Err(res) = res { …Run Code Online (Sandbox Code Playgroud)