为何无法在表达式中使用...语法?模式匹配中该语法可正常编译
为什么Rust模式匹配中的
...能编译,但表达式里不行? 这其实是Rust语法演进过程中的遗留差异,核心原因是Rust团队对范围语法做了统一优化,具体细节如下:
1. 旧版Rust的范围语法历史
在Rust 1.26版本之前,存在两种范围表示方式:
a..b:左闭右开的范围(比如0..3包含0、1、2),表达式和模式匹配都支持a...b:全闭合的范围(比如9...11包含9、10、11),曾经在表达式和模式中都可用
但这个设计存在两个明显问题:一是...和代码里的省略号(比如宏参数中的...)容易混淆;二是两种范围语法的符号不够直观统一。所以Rust团队决定推进语法统一。
2. 表达式中的...被直接废弃
为了让语法更清晰,Rust在后续版本中直接移除了表达式里的...语法,统一用..=来表示全闭合范围。所以你尝试在表达式中写2...6会编译报错,正确的写法是2..=6,比如:
fn main() { println!("{:?}", (2..=6)); // 输出: 2..=6 }
3. 模式匹配中的...是过渡性支持
在模式匹配场景中,...的废弃是逐步推进的——旧版本编译器还保留对它的支持(但会给出警告),目的是让开发者有时间平滑迁移到新语法。比如你的代码里的9...11,在新版本Rust中可以改成9..=11,功能完全一致,而且是官方推荐的写法:
fn how_many(x: i32) -> &'static str { match x { 0 => "no oranges", 1 => "an orange", 2 | 3 => "two or three oranges", 9..=11 => "approximately 10 oranges", // 用..=替代... _ => "few oranges", } }
总结
现在的Rust已经完全统一了范围语法:
- 左闭右开范围:
a..b(表达式和模式都可用) - 全闭合范围:
a..=b(表达式和模式都可用)...语法已经被彻底废弃,无论是表达式还是模式匹配,都建议使用..=来替代。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

