繁体   English   中英

如何在 Rust 中的不同 Future 特征之间创建互操作性?

[英]How can I create interoperability between different Future traits in Rust?

我正在尝试使用binance_async库、 tokiofutures向 Binance 发出并发订单。 (请参阅本问题末尾的注释。)
我使用的binance_async函数返回binance_async::error::Result<impl futures::future::Future<_, _>>类型。 我面临以下问题,在这两个示例中进行了说明:

  1. 假设我正在尝试这样做:
let bn = Binance::with_credential(&api_key, &secret_key);
let fut = bn.limit_sell(&symbol, qty, price);
tokio::spawn(fut.unwrap()); // ERROR
/* Error message:
  error[E0277]: `impl futures::future::Future` is not a future
  --> src/main.rs:23:5
   |
23 |     tokio::spawn(fut.unwrap());
   |     ^^^^^^^^^^^^ `impl futures::future::Future` is not a future
   |
   = help: the trait `futures::Future` is not implemented for `impl 
 futures::future::Future`
*/

这太奇怪了。 首先,我在任何地方都找不到futures::Future ——只有fut.unwrap()实现的futures::future::Future 有什么帮助吗?

  1. 好吧,忘记 Tokio,让我们试试这个:
let mut orders : Vec<Result<_>> = Vec::new();  // not std::Result
let fut = bn.limit_sell(&symbol, qty, price);
    
orders.push(fut);

let mut futures = Vec::new(); // I want to unwrap them, to use join_all()
for f in orders.iter() {
    match *f {
        Ok(x) => {
            futures.push(x);
        },
        Err(e) => {}
    }
}

futures::future::join_all(futures).await; // <--- ERROR!
/* Error message (one of 3 similar ones):
    error[E0277]: `impl futures::future::Future` is not a future
    --> src/main.rs:37:5
    |
 37 |     join_all(futures).await; // <--- ERROR!
    |     ^^^^^^^^^^^^^^^^^^^^^^^ `impl futures::future::Future` is not a future
    |
    = help: the trait `futures::Future` is not implemented for `impl 
 futures::future::Future`
    = note: required because of the requirements on the impl of `futures::Future` for 
 `JoinAll<impl futures::future::Future>`
    = note: required by `futures::Future::poll`
*/

同样的错误,同样的问题。

笔记:

  1. 我可能是过度进口。 如果导入所有这些库看起来有点矫枉过正,甚至是问题的根源,请告诉我!
  2. 我知道binance_async是一个维护不足的库。 我很可能会完全放弃这种方法,而用 go 代替binance crate。 我只是对这个错误很好奇。
  3. 我的主管说这可能与属性宏有关,但我们俩都只有几个月的 Rust 经验,并试图快速完成这项工作,我们无法深入挖掘。

非常感谢:)

binance_async使用 futures 0.1,它与tokio使用的现在标准化的std::future::Future不兼容。 您可以通过启用compat功能将 futures 0.1 未来转换为标准未来:

futures = { version = "0.3", features = ["compat"] }

并调用.compat()方法:

use futures::compat::Future01CompatExt;

tokio::spawn(fut.unwrap().compat());
use futures::compat::Future01CompatExt;

orders.push(fut.compat());
futures::future::join_all(futures).await;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM