Rust或模式规则疑问:类型不统一的非法示例求解
Rust或模式类型检查规则解析
在对表达式
match e_s { a_1 => e_1, ... a_n => e_n }进行类型检查时,对于每个包含p_i | q_i形式模式的匹配分支a_i,若该模式所在深度d处,e_s对应深度的表达式片段类型无法与p_i | q_i统一,则p_i | q_i模式被视为非法。
以上规则来自Rust官方参考手册的或模式章节。
你的示例为何合法?
你写的代码能正常编译,是因为被匹配变量v是i32类型,每个或模式(1|2、3|4等)里的子模式都是i32字面量,完全匹配v的类型,类型可以统一,因此符合规则要求。
什么是“类型统一”?
这里的“统一”指:或模式中的所有子模式,必须和被匹配表达式对应位置的类型完全兼容。简单来说,或模式里的每一个子模式,都得能合法匹配被匹配值的类型,不能出现子模式类型与被匹配值类型不兼容,或是多个子模式之间类型不一致的情况。
非法或模式示例
示例1:混合不同类型的子模式
fn main() { let v = 10; // 类型为i32 match v { 1 | "hello" => println!("非法分支"), // 错误:1是i32,"hello"是&str,无法与v的i32类型统一 _ => println!("合法分支"), }; }
这段代码编译时会报错,因为或模式中的两个子模式类型不统一,且无法同时匹配v的i32类型。
示例2:嵌套结构中类型不匹配
fn main() { let v = (10, "test"); // 元组类型:(i32, &str) match v { (5 | "world", _) => println!("非法分支"), // 错误:元组第一个元素是i32,但"world"是&str,对应深度类型无法统一 _ => println!("合法分支"), }; }
这里元组的第一个元素是i32类型,但或模式里的"world"是字符串切片类型,对应匹配深度的类型不兼容,因此触发非法规则。
内容的提问来源于stack exchange,提问作者Eraklon
相关产品推荐
相关产品推荐

