Rust引用模式是否并非始终不可反驳?我的理解是否正确?
关于Rust引用模式可反驳性的理解
你的理解完全正确,引用模式的可反驳性由其子模式决定,并非“始终不可反驳”——官方文档的表述省略了关键前提条件。
核心逻辑:不可反驳模式的定义
不可反驳模式是指能够匹配对应类型所有可能值的模式,比如:
- 标识符模式
x:可以绑定任意值 - 通配符
_:匹配任意值
与之相对的是可反驳模式,比如字面量模式0,它只能匹配特定值,无法覆盖类型的所有可能情况。
引用模式的可反驳性规则
引用模式&P的可反驳性完全取决于内部的子模式P:
- 如果子模式
P是不可反驳的(比如&x中的x),那么整个&x就是不可反驳的,能匹配任何同类型的引用——不管引用指向什么值,x都能绑定该值。 - 如果子模式
P是可反驳的(比如&0中的0),那么整个&0就是可反驳的,它只能匹配指向0的引用。就像你给出的代码示例:
这里let int_reference = &3; let a = match *int_reference { 0 => "zero", _ => "some" }; let b = match int_reference { &0 => "zero", _ => "some" }; assert_eq!(a, b);int_reference是&3,&0无法匹配它,所以两个match都会走到_分支,a和b都等于"some",断言成立。
对官方文档表述的补充
官方文档里的“引用模式始终是不可反驳的”,其实是特指子模式为不可反驳模式的场景,表述不够严谨才造成了误解。
内容的提问来源于stack exchange,提问作者Eraklon
相关产品推荐
相关产品推荐

