如何在Rust循环中跳出并返回match解析得到的数值?
解决Rust中match分支同时返回值并跳出循环的问题
你遇到的核心矛盾是:试图在match的Ok分支里同时完成给变量赋值和跳出循环两个操作,但Rust语法不允许这样——break会直接中断当前流程,导致分支无法返回所需的u32类型值。
正确解决方案:利用loop的返回值特性
Rust中的loop是一个表达式,它可以通过break 标签 表达式的语法返回值。我们可以把num作为loop的返回值,同时完成跳出循环的操作。
修改后的完整代码如下:
use std::io; // 假设Player是包含name字段的结构体 struct Player { name: String, } fn main() { let players = vec![Player { name: "Alice".into() }, Player { name: "Bob".into() }]; for n in players { println!("It's {}s turn", n.name); // 让loop整体返回u32类型的command值 let command: u32 = 'inner: loop { println!("Input 1 to throw the dice"); let mut command_input = String::new(); io::stdin() .read_line(&mut command_input) .expect("Failed to read line"); match command_input.trim().parse() { Ok(num) => { // 同时完成跳出循环和返回num的操作 break 'inner num; } Err(_) => { println!("You need to input 1 to throw"); continue 'inner; } }; }; // 此处可正常使用拿到的command值 if command == 1 { println!("Throwing dice for {}...", n.name); // 执行扔骰子逻辑 } } }
关键说明
- 把原来loop内部的
let command: u32 = match...改为让loop整体赋值给command变量,loop的返回值就是break 'inner num中的num。 - Ok分支里的
break 'inner num同时完成两个操作:跳出标记为inner的循环,并且将num作为loop表达式的结果返回。 - Err分支的
continue 'inner可保留,用于直接回到循环开头等待下一次输入;省略该语句,loop也会自动继续执行,效果一致。
内容的提问来源于stack exchange,提问作者Kuly14
相关产品推荐
相关产品推荐

