Rust中matches!宏使用变量与直接值为何返回不同结果?
问题解答
你的代码如下:
fn main() { let x = Some(1); let y = Some(2); println!("{}",matches!(x,y)); println!("{}",matches!(x,Some(2))); }
运行后输出true和false,核心原因是**matches!宏的第二个参数是模式匹配语法,不是直接引用外部变量**:
- 当你写
matches!(x, y)时,这里的y不是你之前定义的let y = Some(2)那个变量,而是一个新的标识符模式。这个模式会匹配任何与x类型一致的非None值(也就是所有Some(_)类型),匹配成功后会把Some内部的值绑定到这个新的y变量上(这个绑定会遮蔽外部的y),所以只要x是Some类型就会返回true,不管内部值是什么。 - 而
matches!(x, Some(2))是明确指定匹配Some内部值为2的情况,x是Some(1),自然不匹配,返回false。
如果要比较x和y两个变量的实际值是否相等,直接用x == y即可(Option类型实现了PartialEq trait,支持直接比较),或者用带条件的模式:
matches!(x, Some(val) if val == y.unwrap())
内容的提问来源于stack exchange,提问作者Josif Hamed
相关产品推荐
相关产品推荐

