我对拉斯特很陌生.

以下功能:

async fn create(body: String) -> impl IntoResponse {
    let j = match serde_json::from_str::<CreationJSON>(&body) {
        Ok(j) => j,
        Err (_) => (
            StatusCode::UNPROCESSABLE_ENTITY,
            "body is invalid".to_string(),
        ),
    };
    println!("{:?}", j.record_stringified);

    (
        StatusCode::CREATED,
        "created".to_string(),
    )
}

给出错误:

error[E0308]: `match` arms have incompatible types
   --> src/main.rs:128:20
    |
126 |       let j = match serde_json::from_str::<CreationJSON>(&body) {
    |               ------------------------------------------------- `match` arms have incompatible types
127 |           Ok(j) => j,
    |                    - this is found to be of type `CreationJSON`
128 |           Err (_) => (
    |  ____________________^
129 | |             StatusCode::UNPROCESSABLE_ENTITY,
130 | |             "body is invalid".to_string(),
131 | |         ),
    | |_________^ expected `CreationJSON`, found `(StatusCode, String)`
    |
    = note: expected struct `CreationJSON`
                found tuple `(axum::http::StatusCode, std::string::String)`

但是,如果我在Err号臂上加上一个"回车",那么它就可以正常工作了:

async fn create(body: String) -> impl IntoResponse {
    let j = match serde_json::from_str::<CreationJSON>(&body) {
        Ok(j) => j,
        Err (_) => return (
            StatusCode::UNPROCESSABLE_ENTITY,
            "body is invalid".to_string(),
        ),
    };
    println!("{:?}", j.record_stringified);

    (
        StatusCode::CREATED,
        "created".to_string(),
    )
}

为什么我需要在Err臂中加上return?我以为没有分号的函数应该在Rust中自动返回?

推荐答案

从该函数返回return.如果您不使用关键字return,那么它将从语句中"返回".在第一个示例中,您try 将元组赋给变量j,而在第二个示例中,您从函数返回.

Rust相关问答推荐

为什么我的梅森素数代码的指数越大,速度就越快?

定义采用更高级类型泛型的性状

如何正确地将App handler传递给Tauri中的其他模块?

为什么这是&q;,而让&q;循环是无限循环?

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

为什么&;mut buf[0..buf.len()]会触发一个可变/不可变的borrow 错误?

习语选项<;T>;到选项<;U>;当T->;U用From定义

什么时候使用FuturesOrdered?

为什么BufReader实际上没有缓冲短寻道?

提取指向特征函数的原始指针

如何获取模块树?

将多维数组转换为切片

为什么 i32 Box 类型可以在 Rust 中向下转换?

试图理解 Rust 中的可变闭包

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

为实现特征的所有类型实现显示

使用泛型作为关联类型,没有幻像数据

覆盖类型的要求到底是什么?为什么单个元素元组满足它?

如何迭代调用可能会失败的函数?操作员?