小编jgp*_*iva的帖子

东京::尝试加入!当任务之一返回 Err 时不返回 Err 变体?

我无法理解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)

rust async-await rust-tokio

4
推荐指数
1
解决办法
1562
查看次数

try_fold 是停止无限迭代的首选方法还是有更多惯用的替代方法?

我正在寻找中断无限迭代器迭代的方法。我发现这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)

iteration rust

2
推荐指数
3
解决办法
68
查看次数

标签 统计

rust ×2

async-await ×1

iteration ×1

rust-tokio ×1