Rust猜数游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use std::io; // prelude 序曲

use rand::Rng; // trait 是其他语言的接口,上面有很多方法

use std::cmp::Ordering; // 是一个枚举类型,有三个值,大于,小于,和等于

// rust的库称为crate,crate是一个二进制或库,库是一个包含函数和其他代码的包,二进制crate是一个可以被执行的包,每个crate都有一个crate root,这是一个源文件,编译器从这个文件开始并编译整个crate,crate root是一个源文件,而不是一个目录,一个crate可以包含多个库,但只能包含一个二进制crate

// crate分为二进制crate还有lib库,二进制crate是一个可以被执行的包,lib库是一个包含函数和其他代码的包,但不能被执行,只能被其他crate引用




fn main() {

    println!("猜数!");



    // rng是个接口,上面一个函数gen_range,范围是1-100,包括1,不包括101

    let secret_number = rand::thread_rng().gen_range(1..101);

    // println!("神秘数字是:{}!", secret_number);



    // 使用loop循环,无限循环,直到猜对为止

    loop{



        println!("猜测一个数:");



        // let mut foo = 1;

        // let bar = foo; // immutable

        // 要表示0到100的范围,使用u32,无符号32位整数,默认是i32,有符号32位整数,也可以i64

        let mut guess = String::new();

        // 产生Stdin实例,存句柄,用read_line方法用可变的字符串参数获取输入,前面&表示是引用传递参数,引用默认是不可变的,需要加入mut参数,readline返回Result类型变量,是枚举类型,值称为变体,两个变体:ok和err,ok变体包含一个元组,元组的第一个元素是一个引用,指向一个字符串,这个字符串是readline方法读取的内容,err变体包含一个错误值

        // Result上还定义了方法expect,如果是ok,则这个方法会提取里面的值,如果返回err,则expect会使程序崩溃,并显示传递给expect的参数,显示失败原因

        // 不调用expect方法也行,但是会出现警告,安全性保证

        io::stdin().read_line(&mut guess)

            .expect("无法读取行");

        // rust允许使用同名的新变量来隐藏之前的变量

        // trim方法去掉字符串前后的空白字符,parse方法将字符串转换为数字,parse方法返回Result类型,所以需要expect方法

        let guess:u32 = match guess.trim().parse(){

            Ok(num) => num,

            Err(_) => continue,

        };

        // parse方法将字符串转换为数字,parse方法返回Result类型,所以需要expect方法

        // 声明u32是为了告诉parse()方法,我们想要一个u32类型的数字,如果不声明,parse()方法会返回一个通用数字类型,这样就需要告诉编译器我们想要的类型

        // 这之后的guess是一个新的变量,是一个u32类型,之前的guess是一个字符串类型

        // 花括号是后面变量的值,用来在字符串中插入变量值

        println!("你猜测的数是: {}", guess);

        // 方法guess.cmp,compare,三种情况,使用一个枚举类型

        // match表达式,根据后面返回值决定做什么,多个手臂arm组成,每个手臂都有一个匹配的模式,匹配上就执行操作

        // 如果match紧跟着的某个值和某个手臂的模式匹配,就会执行这个手臂的代码块

        // 静态强类型语言

        match guess.cmp(&secret_number){

            Ordering::Less => println!("太小了!"), // arm

            Ordering::Greater => println!("太大了!"),

            Ordering::Equal => {

                println!("猜对啦!");

                break;

            },

        }

    }

}
作者

anka

发布于

2024-04-18

更新于

2024-09-08

许可协议

评论

You forgot to set the owner, admin, repo,client_id, or client_secret for Gitalk. Please set it in _config.yml.