Rust中如何在match分支指定变量类型?serde_json解析场景问题
解决方法
你可以通过以下三种常用方式告知编译器解析结果的类型:
方法1:使用turbofish语法为serde_json::from_str显式指定泛型参数
这是最常用的写法,直接在函数调用时指定解析的目标类型即可:
match serde_json::from_str::<Response>(msg.to_text().unwrap()) { Ok(result) => { println!("Parsed: {}", result.text); } Err(error) => { println!("Failed to parse: {}, {}", error, msg.to_text().unwrap()); } }
<>内填写你要解析得到的结构体类型,编译器会自动推导返回Result中Ok分支的变量类型。
方法2:提前为返回值标注类型
你可以先把解析结果赋值给一个显式标注了类型的变量,再做匹配:
let parse_result: Result<Response, _> = serde_json::from_str(msg.to_text().unwrap()); match parse_result { Ok(result) => { println!("Parsed: {}", result.text); } Err(error) => { println!("Failed to parse: {}, {}", error, msg.to_text().unwrap()); } }
不需要完整写出错误类型,用_占位即可让编译器自动推导。
方法3:在match分支中通过模式匹配标注类型(Rust 1.59及以上版本支持)
如果你确实希望在match分支内指定类型,可以用类型注解的模式语法:
match serde_json::from_str(msg.to_text().unwrap()) { Ok(result @ Response { .. }) => { println!("Parsed: {}", result.text); } Err(error) => { println!("Failed to parse: {}, {}", error, msg.to_text().unwrap()); } }
这种写法仅适用于匹配结构体/枚举类型的场景,通用性不如前两种方法。
额外注意
你的示例代码存在两处笔误:
println!中用到的变量名是response.text,但你绑定的变量名为result,需保持一致- 第二个代码块中
msg.to_text.unwrap()缺少方法调用括号,正确写法为msg.to_text().unwrap()
内容的提问来源于stack exchange,提问作者s4eed
相关产品推荐
相关产品推荐

