0

有没有办法以“递归”方式链接read_*函数?tokio::io

我基本上想做类似的事情:

read_untilx 然后read_exacty 然后写响应然后回到顶部。

如果您对我在说什么功能感到困惑:https ://docs.rs/tokio/0.1.11/tokio/io/index.html

4

1 回答 1

1

是的,有办法。

read_untilis 返回一个 struct ReadUntil,它实现了Future-trait,它本身提供了很多有用的功能,例如and_then可用于链接期货。

一个简单(愚蠢)的示例如下所示:

extern crate futures;
extern crate tokio_io; // 0.1.8 // 0.1.24

use futures::future::Future;
use std::io::Cursor;
use tokio_io::io::{read_exact, read_until};

fn main() {
    let cursor = Cursor::new(b"abcdef\ngh");
    let mut buf = vec![0u8; 2];
    println!(
        "{:?}",
        String::from_utf8_lossy(
            read_until(cursor, b'\n', vec![])
                .and_then(|r| read_exact(r.0, &mut buf))
                .wait()
                .unwrap()
                .1
        )
    );
}

在这里,我使用了一个 Cursor,它恰好实现了AsyncRead-trait 并使用该read_until函数读取,直到出现换行符(在'f'and之间'g')。
然后链接我and_then用来read_exact在成功的情况下使用的那些,wait用来Result解开它(不要在生产孩子中这样做!)并从元组中获取第二个参数(第一个是光标)。
最后,我将 转换Vec为字符串以"gh"显示println!.

于 2018-10-19T08:18:19.120 回答