如何正确使用Rust的text_io crate?按文档编写代码触发panic
问题原因与解决方法
你的问题出在对text_io库中read!宏的用法误解上:
read!宏的格式化字符串不是用来输出提示文本的,而是用来匹配输入内容的结构的。你写的read!("Insert Celsius: {}!")相当于告诉宏:必须读取完全符合Insert Celsius: [数值]!格式的输入(比如你得输入Insert Celsius: 6!才会匹配),但你实际只输入了6,宏找不到预期的前缀文本,直接解析失败触发panic。
修正后的正确写法
如果你需要先输出提示再读取数值,有两种标准方式:
方式1:保持提示与读取分离(和你正常运行的代码一致)
fn main() { println!("Celsius to farenheit"); print!("Insert Celsius: "); let celsius: f32 = read!(); println!("Celsius to Farenheit is: {}", cel_to_far(celsius)); }
方式2:正确使用read!的格式匹配(仅当输入包含固定文本时用)
比如如果要求用户输入格式必须是C: 25这样的内容,才需要用带格式的read!:
fn main() { println!("Celsius to farenheit"); print!("Insert Celsius (format: C: [number]): "); let celsius: f32 = read!("C: {}"); println!("Celsius to Farenheit is: {}", cel_to_far(celsius)); }
此时用户输入C: 6就能正常解析出数值6。
关于报错信息的解释
UnexpectedValue(73, Some(54))里的数字是ASCII码:
- 73对应字符
I(你写的格式字符串开头是Insert) - 54对应字符
6(你实际输入的内容)
宏预期输入的第一个字符是I,但收到的是6,因此抛出不匹配错误。
内容的提问来源于stack exchange,提问作者Andres
相关产品推荐
相关产品推荐

