有没有办法以“递归”方式链接read_*
函数?tokio::io
我基本上想做类似的事情:
read_until
x 然后read_exact
y 然后写响应然后回到顶部。
如果您对我在说什么功能感到困惑:https ://docs.rs/tokio/0.1.11/tokio/io/index.html
有没有办法以“递归”方式链接read_*
函数?tokio::io
我基本上想做类似的事情:
read_until
x 然后read_exact
y 然后写响应然后回到顶部。
如果您对我在说什么功能感到困惑:https ://docs.rs/tokio/0.1.11/tokio/io/index.html
是的,有办法。
read_until
is 返回一个 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!
.