【发布时间】:2020-11-21 09:45:06
【问题描述】:
我正在使用 async-tungstenite 监听 websocket,并使用 async-std 的 StreamExt 对结果流进行操作。
我想使用 HashMap 从 websocket 中累积最新的 Ticker 值。稍后将查找这些 Ticker 值以用于计算。我使用 Ticker 结构的符号(字符串)值作为 HashMap 的键。我正在使用 .scan StreamExt 方法进行累积。
但是,我收到与生命周期相关的编译错误。这是一些精简的代码:
let tickers = HashMap::new();
let mut stream = ws.
.scan(tickers, accumulate_tickers);
while let msg = stream.next().await {
println!("{:?}", msg)
}
...以及accumulate_tickers函数:
fn accumulate_tickers(tps: &mut HashMap<String, Ticker>, bt: Ticker) -> Option<&HashMap<String, Ticker>> {
tps.insert((*bt.symbol).to_string(), bt);
Some(tps)
}
我收到的编译错误如下:
error[E0271]: type mismatch resolving `for<'r> <for<'s> fn(&'s mut std::collections::HashMap<std::string::String, ws_async::model::websocket::Ticker>, ws_async::model::websocket::Ticker) -> std::option::Option<&'s std::collections::HashMap<std::string::String, ws_async::model::websocket::Ticker>> {accumulate_tickers} as std::ops::FnOnce<(&'r mut std::collections::HashMap<std::string::String, ws_async::model::websocket::Ticker>, ws_async::model::websocket::Ticker)>>::Output == std::option::Option<_>`
--> examples/async_std-ws.rs:64:4
|
64 | .scan(tickers, accumulate_tickers);
| ^^^^ expected bound lifetime parameter, found concrete lifetime
我不知道有一种方法可以为扫描方法提供生命周期参数。
我想知道这个问题是否可能与我修改 HashMap 然后尝试返回它的事实有关(是移动问题吗?)。我该如何解决这个问题,或者至少缩小原因?
【问题讨论】: