Rust Guessing Game
简介
rust官方示例,猜猜看游戏 guessing_game 的小程序。从中我们可以感性认识到:
extern crates
外部包装箱use crates
标准包装箱 和 包装箱fn func()
,.method()
函数,方法,关联函数let
,mut
,:u32
等用于绑定的关键字loop
循环enum
枚举match
条件判断expect()
异常处理{}
在println中使用的占位符- 以及一些有趣的
method
方法和关联函数
包装箱crates
类似其他语言中的库library
或者包package
绑定bindings
类似其他语言中的变量variable
阅读源码之前
如果你未了解如何使用Cargo构建和运行你的程序,或者不知道如何依赖外部包装箱。
请参阅下面的文章:rust cargo使用
源码
做了些注释便于阅读,如有不当之处,请耐心指出,谢谢!
extern crate rand; // 类似于use rand; (需在Cargo.toml中添加此外部依赖)
use std::io; // 使用std库的io库, 类似于namespace
use std::cmp::Ordering;
use rand::Rng; // rand的位置 称为 特性traits域
fn main() // 输入是空元组
{
println!("Guess the number!");
/* gen_range() 包含下限但不包含上限 */
let secret_number = rand::thread_rng().gen_range(1, 101);
// println!("The secret number is: {}", secret_number);
loop
{
println!("Please input your number:");
/*
let 创建新'绑定' '绑定'在其他语言中称为'变量 variable'
'绑定'默认是不可变的'immutable' 在c中称为'const'的
mut 让'绑定'可变。'mutable'
----
let foo = bar; // immutable
let mut foo = bar; // mutable
*/
/*
String 字符串type,由std库提供 String是可增长的,UTF-8文本
:: 是type的“关联函数” 即::new()和String关联,而非String的实例.
一些语言管这叫一个“静态方法”
(而 . 是实例的方法)
new() 函数,创建一个空的type。 很多其他type上都能找到 new() 函数
*/
let mut guess = String::new();
/*
io::stdin() 如果文件开头不写 use std::io,
则这里需要写std::io::stdin(),
stdin() 返回一个指向终端标准输入的句柄
read_line() stdin()的方法,一个type的特定实例(这里的实例是stdin())上可用
( :: 是类型的关联函数)
&mut guess &为引用,引用默认是不可变的'immutable'。
而read_line()只接收&mut String类型
.expect("Failed to read line");
read_line()的返回值 io::Result,有个expect()的方法
*/
io::stdin().read_line(&mut guess).expect("Fail to readline");
/*
let guess: u32 Rust 允许我们用新值 遮盖shadow 之前的变量
Shadowing 让我们重用 guess 名字,而不是强迫我们想出两个独特名字
guess.trim().parse()
trim() method, 会去掉字符串开头和结尾的任何空格
parse() method, 将字符串解析为'一些类型'的数字
而这个 一些类型 由之前 let guess: u32,而被认为是u32类型
parse() 返回值有Ok和Err两种enum
*/
// let guess: u32 = guess.trim().parse().expect("Please type a number!");
let guess: u32 =
match guess.trim().parse()
{
Ok(num) => num,
Err(_) => continue,
};
/*
{} 占位符
*/
println!("your guessd: {}", guess);
/*
cmp() 可以在任何能被比较的值上调用,并且它获取你想要比较的值的引用
cmp() 返回一个 Ordering 类型
Ordering 是一个 枚举enum,类似于:
enum Ordering
{
Less,
Greater,
Equal,
};
用 :: 来表明一个特定 enum 变量的命名空间
*/
match guess.cmp(&secret_number)
{
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {println!("You win!"); break;}
}//match
}// loop
}//end of main()