You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:46:09