如何在匹配臂中表达变量类型?

How to express variable type in match arm?

我正在尝试使用 Rust 中的 serde_json 解析一段 json 字符串。我想使用以下语法匹配解析结果:

match serde_json::from_str(msg.to_text().unwrap()) {
    Ok(result) => {
        println!("Parsed: {}", response.text);
    }
    Err(error) => {
        println!("Failed to parse: {}", error);
    }
}

但是编译器向我抱怨他不知道 result 的类型,当然,他是对的。但是我怎样才能告诉他 result 的类型呢?我尝试了以下代码,但它也没有用。所以我想在match arm中表达变量的类型

match serde_json::from_str(msg.to_text().unwrap()) {
    Ok(result: Response) => {
        println!("Parsed: {}", response.text);
    }
    Err(error) => {
        println!("Failed to parse: {}, {}", error, msg.to_text.unwrap());
    }
}

有几种方法可以指定类型。您可以使用 type parameters in the function call 显式指定它,即使用此语法 func::<T>().

match serde_json::from_str::<Response>(json) {
    Ok(response) => {}
    Err(err) => {}
}

或者,您可以将初始结果分配给一个变量,并在其中提示类型,即

let res: Result<Response, _> = serde_json::from_str(json);
match res {
    Ok(response) => {}
    Err(err) => {}
}

match serde_json::from_str(json) {
    Ok(response) => {
        let response: Response = response;
    }
    Err(err) => {}
}

最后你还可以使用@ bindings。但是,如果您的类型是 enum,这将不起作用,因为您必须指定您想要的确切变体。

例如,如果 Response 是一个 enum 你可以有多个 Ok(resp @ Response::???) 匹配臂。但是你不能有一个 Ok(resp @ Response) 火柴臂。

match serde_json::from_str(json) {
    Ok(response @ Response { .. }) => {}
    Err(err) => {}
}