为什么在使用match语句处理Result时会出现“期望类型Future”的错误?

3
我正在尝试使用一个外部板条箱中的函数,根据函数的签名,它应该返回一个Result<T, E>结构体。
pub async fn market_metrics(symbols: &[String]) -> Result<Vec<market_metrics::Item>, ApiError>

我正在尝试按照Rust文档中的指示使用match语句来解包Result<T, E>,但出现了某种错误:

use tastyworks::market_metrics;

fn main() {
    let symbols = &[String::from("AAPL")];
    let m = market_metrics(symbols);
    match m {
        Ok(v) => v,
        Err(e) => panic!(e),
    }
}

error[E0308]: mismatched types
  --> src/main.rs:7:9
   |
7  |         Ok(v) => v,
   |         ^^^^^ expected opaque type, found enum `std::result::Result`
   | 
  ::: /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/tastyworks-0.13.0/src/lib.rs:79:52
   |
79 | pub async fn market_metrics(symbols: &[String]) -> Result<Vec<market_metrics::Item>, ApiError> {
   |                                                    ------------------------------------------- the `Output` of this `async fn`'s expected opaque type
   |
   = note: expected opaque type `impl std::future::Future`
                     found enum `std::result::Result<_, _>`

使用此crate的Cargo.toml依赖关系为:tastyworks = "0.13"

1个回答

4
你正在尝试使用的函数是一个异步函数(async),因此你需要为它创建一个异步任务或在异步上下文中运行它。你需要使用tokio(或另一个异步后端)来实现它:
use tastyworks::market_metrics;
use tokio;

#[tokio::main]
async fn main() {
    let symbols = &[String::from("AAPL")];
    let m = market_metrics(symbols).await;
    match m {
        Ok(v) => v,
        Err(e) => panic!(e),
    }
}

查看一些有趣的相关答案


谢谢您的快速回复,我会更多地了解异步编程。同时,我尝试运行您的代码,但出现了以下错误:无法解析:在tokio中找不到main函数;rustc(E0433) main.rs(4, 10):在tokio中找不到'main'函数,而且主函数不允许是异步的主函数不允许是异步的 rustc(E0752) main.rs(5, 1): 主函数不允许是异步的 - orie
@orie,你的tokio cargo条目中可能缺少tokio = { version = "1", features = ["full"] } - Netwave
虽然这有所帮助,但现在它产生了一个与Tokio相关的问题:“thread 'main' panicked at 'not currently running on a Tokio 0.2.x runtime.', /Users/or/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.25/src/runtime/handle.rs:118:28”。 - orie
1
这意味着您也必须使用 tokio = { version = "0.2" },因为不能同时使用多个主要版本的 Tokio。 - Cerberus
此外,使用 features = ["full"] 导入 tokio 可能会给你和依赖项带来许多不必要的功能。你可以尝试使用 features = ["macros", "rt-core"]features = ["macros", "rt-threaded"],具体取决于你想要使用单线程还是多线程运行时。 - sebpuetz
更改为 tokio = { version = "0.2", features = ["full"] } 工作了,感谢大家的支持! - orie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接