Rust中match匹配String失效问题及优化方法咨询
问题原因与解决方法
问题根源
std::io::stdin().read_line(&mut calc)会将用户输入的**换行符(\n,Windows下是\r\n)**也一并读取到字符串中。比如你输入sum后按回车,calc实际存储的内容是"sum\n",和match分支里的"sum"完全不匹配,因此每次都会命中默认分支返回0。
解决方法
最直接的方式是去掉字符串首尾的空白字符(包括换行、空格等),使用String的trim()方法即可:
use std::io; // 补充示例函数实现,你可以替换成自己的逻辑 fn sum() -> i32 { 10 + 20 } fn subtraction() -> i32 { 50 - 15 } fn division() -> i32 { 40 / 8 } fn multiplication() -> i32 { 6 * 7 } fn main() { println!("Enter what type of calc u want: "); let mut calc = String::new(); io::stdin().read_line(&mut calc).expect("Failed to read"); println!("u selected: {}", calc); let result = match calc.trim() { // 用trim()去掉首尾空白,包括换行符 "sum" => sum(), "subtraction" => subtraction(), "division" => division(), "multiplication" => multiplication(), _ => 0, // 这里简化为_即可,无需&_ }; println!("{}", result); }
其他可选方案
如果你只想精确移除末尾的换行符(保留开头可能的空格),可以手动处理:
// 移除Unix风格的换行符\n if let Some('\n') = calc.chars().next_back() { calc.pop(); } // 移除Windows风格的回车符\r if let Some('\r') = calc.chars().next_back() { calc.pop(); }
不过trim()方法更简洁通用,能自动处理所有类型的空白字符,推荐优先使用。
内容的提问来源于stack exchange,提问作者Felipe Augustos
相关产品推荐
相关产品推荐

