Rust从入门到跑路 - 第三篇 猜数字游戏(2)

561 阅读2分钟

这是我参与更文挑战的第6天,活动详情查看: 更文挑战

Rust是一门赋予每个人构建可靠且高效软件能力的语言。

下面所有的例子以及代码都是以Mac环境,编辑器是vscode,如果遇到什么问题,欢迎加入交流群,一起交流。

上篇文章已经完成了从终端输入输出的操作,既然是一个猜数字的游戏,终端输入总是字符串,怎么才能获取数字呢

Rust VS NodeJS 类型转换

当从终端输入一个数字时,获取到依旧是个字符串,这是IO操作导致的结果,所以需要将接受的字符串转换成数字,这时候就用到了强制类型转换。

NodeJS 类型转换

JavaScript类型转换有很多种方式,比如Number,parseInt

Number('1') => 1
Number('1 ') => 1
parseInt('1') => 1
parseInt('1 ') => 1

Rust 类型转换

新增一行类型转换代码let str: u32 = str.trim().parse().expect("Please type a number!");

use std::io;
fn main() {
    println!("欢迎来到猜数字游戏");
    let mut str = String::new();
    io::stdin().read_line(&mut str).expect("接收数字失败,请重新输入");
    let str: u32 = str.trim().parse()
        .expect("Please type a number!");
    println!("你猜的数字是: {}", str);
}

1、为什么用trim()方法

这里的trim()方法其实和JavaScript方法是一致的,去除字符串开头和结尾的空白字符。所以当输入完数字之后,必须输入enter键才能让read_line返回,然而用户按下enter键时,会在字符串中增加一个换行(newline)符。例如,用户输入5并按下enterstr看起来像这样:5\n\n代表 「换行」,回车键。trim方法消除\n,只留下5

2、为什么用parse()方法

当我们格式化完一个无用的操作符之后,剩下的是可以完全可以用过/^\d+$/g匹配的纯字符串。parse是Rust的类型转换函数,只能转换纯数字,并不能像JavaScript那么智能。(注:其实看parse的实现,可以看到是利用turbofish操作符(::<>)),所以上面语句等价于str.trim().parse::<u32>().expect("Please type a number!");这个后面再详细介绍。

3、为什么用expect("Please type a number!");

因为Rust并没有提供像JavaScript里面的typeof等类型检测方法,所有parse方法底层回去做类型检测,如果类型检测失败,则通过Result将异常抛出。其实,我们也可以不做异常捕获,那样更适合做单元测试。

let a = str.trim().parse::<u32>() // => 4
assert_eq!(Ok(4), str)

结尾

下一节:第三篇 猜数字游戏(3)

上一节:第三篇 猜数字游戏(2)