通过if let块结合Enum重构Rust变量赋值
问题分析与解决方案
你的重构代码存在两个关键问题:
- 内部
if分支的字符串后加了分号,导致分支返回单元类型()而非目标类型&str; - 未处理
res_info不是Video变体的情况,编译器无法推导res的确定类型。
修正后的简洁写法
方式一:用match覆盖所有分支(推荐)
let res = match res_info { Video(n) if n.pixel_width > 1920 => "2160p", Video(_) => "1080p", _ => "", // 对应原代码中res_info非Video时的初始值 };
方式二:修正你原有的if let写法
let res = if let Video(n) = res_info { if n.pixel_width > 1920 { "2160p" // 去掉分号,让分支返回字符串字面量 } else { "1080p" // 同样去掉分号 } } else { "" // 补上else分支,保证所有路径都返回&str类型 };
原写法失效原因
Rust中,分号会将表达式转为语句,返回单元类型()。你原代码里的"2160p";和"1080p";都是语句,导致整个if let表达式的返回值是(),无法匹配res需要的&str类型。同时,if let只覆盖了res_info为Video的情况,缺少其他分支的返回值,编译器会因类型不确定报错。
内容的提问来源于stack exchange,提问作者Jackxx
相关产品推荐
相关产品推荐

