想象一下,一些 future 存储在一个Vec长度由运行时决定的 a 中,你应该同时加入这些 future,你应该怎么做?
显然,通过文档中的示例tokio::join,手动指定每个长度Vec可能是,如 1,2,3,... 并处理可观的案例应该工作。
extern crate tokio;
let v = Vec::new();
v.push(future_1);
// directly or indirectly you push many futures to the vector
v.push(future_N);
// to join these futures concurrently one possible way is
if v.len() == 0 {}
if v.len() == 1 { join!(v.pop()); }
if v.len() == 2 { join!(v.pop(), v.pop() ); }
// ...
Run Code Online (Sandbox Code Playgroud)
我还注意到 tokio::join! 当我使用类似的语法时,将列表作为文档中的参数
tokio::join!(v);
Run Code Online (Sandbox Code Playgroud)
或类似的东西
tokio::join![ v ] / tokio::join![ v[..] ] …Run Code Online (Sandbox Code Playgroud) 包含 Box 作为成员变量的结构:
type Item = dyn Fn() -> Result<(), Box<dyn std::error::Error + Send + Sync>>;
struct Inner {
pub data: Box<Item>,
}
// a function, like the type: Item
fn parse() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
println!("parse called");
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
Inner现在出现了自定义实现结构体反序列化的问题:
let s = r#"{"data": "parse"}"#;
Run Code Online (Sandbox Code Playgroud)
进入结构体内部:
{
data: Box::new(parse)
}
Run Code Online (Sandbox Code Playgroud)
我知道serde不要实现 deserialize for ,并且必须手动实现 Deserialize ,这是我的代码,遵循docmentaionBox<T>给出的示例:
let s = r#"{"data": "parse"}"#;
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这些代码时,出现错误:
{
data: Box::new(parse)
}
Run Code Online (Sandbox Code Playgroud)
粗略地说,我猜问题出在(***) …