【问题标题】:How to express variable type in match arm?如何在匹配臂中表达变量类型?
【发布时间】:2021-11-03 06:30:04
【问题描述】:

我正在尝试在 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());
    }
}

【问题讨论】:

  • 实际应用中一般不需要。
  • @Stargateur 你是什么意思?只使用unwrap?
  • 没有明确提示,类型推断将无法工作

标签: rust serde-json


【解决方案1】:

有几种方法可以指定类型。您可以使用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,这将不起作用,因为您必须指定所需的确切变体。

如,如果Responseenum,您可以有多个Ok(resp @ Response::???) 匹配臂。但是你不能有一个 Ok(resp @ Response) 匹配手臂。

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

【讨论】:

    猜你喜欢
    • 2015-06-23
    • 2019-08-10
    • 2016-03-16
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多