目录
一.数据类型
(一).基础类型
类型 | 含义 | 类型 | 含义 |
i8 | 8位int | u8 | 无符号8位int |
i32 | 32位int | u32 | 无符号~ |
i64 | 64位int | u64 | 无符号~ |
i128 | 128位int | u128 | 无符号~ |
isize | 与机器位数有关 | usize | 无符号~ |
f32 | 32位浮点型 | f64 | 64位浮点型 |
str | 字符串类型 | String | 类比c++STL中string |
(二).进制
进制 | 形式 |
10进制 | 20 |
2进制 | 0b0001 0100 |
8进制 | 0o24 |
16进制 | 0x14 |
(三).复合类型
①tuple
类比c语言struct。
使用方式:
fn main() {
let st:(i32, u32, String, f64) = (-500, 500, String::from("hello Rust"), 3.14);
println!("{}", st.0);
println!("{}", st.2);
let (x, y, z, w) = st.clone();//深拷贝
println!("{}", z);
}
②数组
既可以接收i32之类,也可以接收String之类类型。
使用方式,大致4种:
let arr1 = [1, 2, 3, 4];
let arr2 = ["hello", "Rust", "World"];
// [类型; 个数]
let arr3:[String; 3] = [String::from("hello"), String::from("Rust"), String::from("World")];
// [数据;个数]
let arr4 = [3;5];//let arr4 = [3, 3, 3, 3, 3];
二.函数
fn是函数的关键字,用以声明函数。
Rust不关心函数声明位置,在调用位置之后也可以。
返回值:
有返回值时,“{”前必须加"-> 返回类型"。
Rust不用特意写return返回,默认函数最后一个函数表达式作为返回,必须没有分号,如果最后一句带有分号相当于不返回任何数据。
也可以使用return来显式返回。
fn main() {
let ret = sum(1, 2);
println!("{}", ret);
}
fn sum(a: i32, b: i32) -> i32
{
println!("进入sum函数");
a + b
}
三.循环和if
(一).if
使用方式与C语言类似。
if在使用时可以不加括号"()"。
判断条件必须是bool类型,不支持隐式类型转换。
例:
fn main() {
let i = 3;
if (i == 0) {}//正确
if i == 3 {}//正确
if i {}//错误
}
(二).loop
loop默认死循环,直到遇见break语句时跳出循环,并可以返回一个值。
fn main() {
let mut num = 5;
let ret = loop{
if num == 0 {
break String::from("Hello Rust");
}
num -= 1;
};
println!("{}", ret);
}
(三).while
使用与C语言类似,但是没有"()"。
fn main() {
let mut num = 5;
while num > 0{
println!("{}", num);
num -= 1;
}
}
(四).for
for的使用与C++范围for类似,同样不加"()"。
/*
(1..6)是一个range类型,范围是左闭右开,
.rev()是该类型的一个方法,用于反转range。
*/
fn main() {
for i in (1..6).rev(){
println!("{}", i);
}
let arr:[i32;5] = [1, 2, 3, 4, 5];
for i in arr.iter(){
println!("{}", i);
}
}
四.猜数游戏
随机生成一个数字供玩家猜测,直到猜中为止,并提示玩家是否继续玩。
use std::io;
use rand::Rng;
use std::cmp::Ordering;
fn main()
{
loop{
let mut Rand_Num = rand::thread_rng().gen_range(1..101);//获取随机数
loop{
println!("请猜一个数字");
let mut guess = String::new();
io::stdin().read_line(&mut guess);
//match暂时可以类比switch
let guess: u32 = match guess.trim().parse(){ //判断输入数字是否是u32类型
Ok(num) => num,//是u32,num给guess
Err(_) => continue, //不是,更新输入
};
match guess.cmp(&Rand_Num){ //数字比较
Ordering::Less=>println!("小了"),
Ordering::Greater=>println!("大了"),
Ordering::Equal=>{
println!("正确,就是{}", Rand_Num);
break;
}
}
}
println!("是否继续玩? y/n");
let mut key = String::new();
io::stdin().read_line(&mut key);
match key.trim().to_lowercase().as_str(){//string转成str类型
"y" => continue,
"n" => break,
&_ => todo!(),//异常退出
}
}
}