Rust匹配语句动态值匹配异常及self.n无法直接匹配问题
问题解答
核心匹配问题:为什么除了row=1都进n分支?
Rust的match分支里,小写标识符是变量绑定,不是“匹配等于该变量的值”。你写的n => {...}其实是把所有没匹配到1的row值,绑定给一个新的局部变量n,完全和你之前定义的let n = self.n没关系,所以自然所有非1的情况都走这个分支。
要实现“仅当row等于self.n时走该分支”,需要用匹配守卫(match guard)——在分支模式后面加if 条件来过滤:
pub fn open(&mut self, row: usize, col: usize) { let n = self.n; let mut do_up = true; // 假设do_up是提前声明的变量 let mut do_down = true; match row { 1 => { do_up = false; self.union(self.cell(row, col), 0) } // 用x绑定row的值,然后通过守卫判断是否等于n x if x == n => { println!("this"); do_down = false; self.union(self.cell(row, col), self.n) } _ => {} } }
为什么不能直接用self.n作为match分支?
match的分支必须是模式,而self.n是一个运行时的表达式(访问实例字段),不是合法的模式。模式是编译时就能确定结构的语法(比如字面量、变量绑定、结构体解构等),无法直接用运行时的值来做模式匹配。所以必须先把self.n赋值给一个局部变量,再通过匹配守卫来判断相等性。
内容的提问来源于stack exchange,提问作者unsafe_where_true
相关产品推荐
相关产品推荐

