我可以声明一个可以采用不同类型的函数或结构吗?

尼可LS

我想编写一个调用 API 的函数,并将端点作为 &str 和它应该放入主体的数据,我的函数如下所示:

async fn call_clientd<T>(query : &str, json : &T) -> Result<ResBody, reqwest::Error>
where T  : serde::ser::Serialize + ?Sized
{
    let res = Client::new()
        .post(format!("{}{}", "http://127.0.0.1:8080/", query))
        .json(json)
        .send()
        .await?;
   let res : ResBody = res.json().await?;
   Ok(res)
}

我需要用 String 和 u64 调用它:

let (res, raw) = match &args.command {
        Commands::Info { raw } => {
            (call_clientd("info", ""), raw)
        },
        Commands::Pending {raw} => {
            (call_clientd("pending", ""), raw)
        },
        Commands::Spend {amount, raw} => {
            (call_clientd("spend", amount), raw)
        },
        Commands::Reissue {coins, raw, validate} => {
            (call_clientd("reissue", coins), raw)
        },
        Commands::Events { raw} => {
            (call_clientd("events", ""), raw)
        },
    };

但是编译器总是推断(在这种情况下)该函数需要一个&str*......有没有可能的方法来做到这一点?我的替代方案非常多余。

我得到的错误似乎将匹配臂作为问题而不是函数本身(之前没有看到):

error[E0308]: `match` arms have incompatible types
   --> mint-client/src/bin/client-cli/main.rs:64:13
    |
56  |       let (res, raw) = match &args.command {
    |  ______________________-
57  | |         Commands::Info { raw } => {
58  | |             (call_clientd("info", ""), raw)
    | |             ------------------------------- this is found to be of type `(impl Future<Output = Result<ResBody, reqwest::Error>>, &bool)`
59  | |         },
60  | |         Commands::Pending {raw} => {
61  | |             (call_clientd("pending", ""), raw)
    | |             ---------------------------------- this is found to be of type `(impl Future<Output = Result<ResBody, reqwest::Error>>, &bool)`
...   |
64  | |             (call_clientd("spend", amount), raw)
    | |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `str`, found `u64`
...   |
71  | |         },
72  | |     };
    | |_____- `match` arms have incompatible types
    |
捷豹路虎

这里的问题是它call_clientd是一个async函数,这意味着它确实返回了一些实现Future<Output = Result<ResBody, reqwest::Error>>. 当你对 使用不同的类型参数时call_clientd,你会得到不同的(不兼容的)返回的期货。

错误中显示“expected str, found u64”的部分有点误导:编译器看到第一个匹配臂返回了未来,call_clientd::<str>所以它告诉你它想要相同的未来,而是找到了未来call_clientd::<u64>

由于您不太可能想要未来本身,因此您可以简单await地获取底层Result<ResBody, reqwest::Error>

let (res, raw) = match &args.command {
        Commands::Info { raw } => {
            (call_clientd("info", "").await, raw)
        },
        Commands::Pending {raw} => {
            (call_clientd("pending", "").await, raw)
        },
        Commands::Spend {amount, raw} => {
            (call_clientd("spend", amount).await, raw)
        },
        Commands::Reissue {coins, raw, validate} => {
            (call_clientd("reissue", coins).await, raw)
        },
        Commands::Events { raw} => {
            (call_clientd("events", "").await, raw)
        },
    };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可以采用不同类型结构 C# 的函数

我可以在父类中声明一个占位符变量,在子类中以不同类型声明它吗?

一个 JavaScript 函数可以处理不同类型的 HTML 输入类型吗?

在ada编程语言中,是否有一种方法可以创建一个采用不同类型的枚举的子类型?

将一个属性名称与采用不同类型的多个构造函数一起使用

我可以在类型定义函数签名中放置一个throw声明吗?

我可以创建一个可以用不同方法访问的对象吗?

我可以编写一个在D中采用静态char数组的函数吗?

我可以在一个轴上对不同类别进行调整和斜体显示吗?

我可以在一个事务中更新多个相同类型的聚合实例吗?

我们可以在类声明中声明一个类类型的指针吗?

我可以声明一个可以在任何对象内调用的函数吗?

我可以创建一个可以采用任何枚举的模板(非类型)参数类吗?C++11

我可以用不同的名称导入“下一个/图像”吗?

我可以使用一个使用不同表参数的触发器吗?

是否可以制作一个可以采用C结构中定义的不同值的变量?

我可以存储一个指向前向声明的类/结构的指针吗?

您可以声明一个成员函数并使它们执行不同的操作吗?

我们可以在C中与变量一起声明一个函数吗?

我可以只从声明中生成一个简单的构造函数吗?

我可以用constexpr函数声明一个静态数组吗

我可以在“if 语句”中声明一个变量吗?

一个构造函数可以照顾多种类型的不同对象参数吗?

您可以使一个函数接受两种不同的数据类型吗?

一个函数可以有两种不同的返回类型吗?

在PostgreSQL中,如何声明一个接受不同类型参数的可变参数函数?

函数可以返回多个不同类型的值吗?

我可以将一个函数和不同数量的参数传递给另一个函数吗?

我可以在Java中创建不同类型的ArrayList吗