让学习快乐起来
注释 ✨✨✨
// 这是一条注释
语法跟 go是一样的
所有权和借用 (crud是很重要的)✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
-
让我们这样去思考,我们如何管理一个值呢?crud??
是的,在rust中我们需要管理值的crud!!!! -
值只有值的owner可以删除值,或者换句话说,值是一个资源,有两个角色可以管理它,owenr和borrower。
owenr(所有权): 对值进行增删改查
borrower(借用者): 读写的权利,但是无权删除 read borrow
-
如果这个时候你思考,那如果一个值正在借用它,但是他被owner干掉了,这可咋办???(这是最自然而然的问题吧)
答案是:rust 不允许!
这触发了借用规则: 值在任一时刻只有一个可变应用或者多个不可变应用。通俗点:只允许有一个人可以修改它,其他人只能读。所有者和借用者都能修改这个值,这是不允许发生的。 -
ps: 如果你觉得可能会出现安全问题,或者说满脑子疑惑???那就去问gpt吧。
函数 ✨✨✨✨✨
- 函数很简单,因为难的我不讲
// 1.无返回值
fn print_a_b(a:i32, b:i32) {
println!("{},{}",a, b)
}
// 2.隐式return
fn add_a_b(a:i32, b:i32) -> i32 {
a+b
}
// 3.显式return
fn find_index(s: Vec<i32>, ele: i32) -> i32 {
for (index, &element) in s.iter().enumerate() {
if element == ele {
return index as i32;
}
}
-1 // 如果未找到元素,返回-1
}
// 4.多变量一起声明
// BAD!
fn print_a_b_c_d(a,b,c,d:i32){
println!("{},{},{},{}",a, b,c,d)
}
// GOOD
fn print_a_b_c_d((a, b, c, d): (i32, i32, i32, i32)) {
println!("{},{},{},{}", a, b, c, d);
// 我还是倾向于一个一个声明,像示例2那样。这种地方没有什么好方便的。
}
## 结构体 ✨✨✨✨✨
1. en,我就是为了讲方法,引出结构体。众所周知我是个gopher,没什么好讲的
```rust
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
方法 ✨✨✨✨✨
- 为了给结构体实现方法,使用impl 块
- 方法有三种,实例方法,关联函数(静态方法,或者说类方法)
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
// 肯定要有一个new函数
fn new_user(email: String, username: String) -> User {
User {
active: true,
username: username,
email: email,
sign_in_count: 1,
}
}
impl User {
// 实例方法
fn get_username(&self) -> &str {
self.username
}
fn set_username(&mut self, name &str) {
self.username = name
}
// 静态方法✨✨✨✨✨✨✨✨✨✨,眼熟不,是不是就是默认实例的初始化
fn default() ->User{
User {
active: true,
username: username,
email: email,
sign_in_count: 1,
}
}
}
枚举 ✨✨✨✨✨✨✨✨✨✨✨
枚举是一组相关业务的抽象。业务!业务!业务!,而你并不需要关注这些业务的行为以及规范。他们不需要遵守约定。枚举相当强大我觉得
// 定义一个枚举类型,表示人的衣食住行
enum PersonAspect {
Clothing {
style: String,
size: String
},
Food {
meal_type: String,
calories: u32
},
Residence {
address: String,
square_meters: u32
},
Transportation {
mode: String,
license_plate: Option<String>
},
}
// 函数接受一个 PersonAspect 枚举作为参数,并根据不同方面输出信息
// match和go的switch一样,通过匹配出结果执行指定的分支
fn describe_person_aspect(aspect: PersonAspect) {
match aspect {
PersonAspect::Clothing { style, size } => {
println!("Clothing - Style: {}, Size: {}", style, size);
},
PersonAspect::Food { meal_type, calories } => {
println!("Food - Meal Type: {}, Calories: {}", meal_type, calories);
},
PersonAspect::Residence { address, square_meters } => {
println!("Residence - Address: {}, Square Meters: {}", address, square_meters);
},
PersonAspect::Transportation { mode, license_plate } => {
match license_plate {
Some(plate) => println!("Transportation - Mode: {}, License Plate: {}", mode, plate),
None => println!("Transportation - Mode: {}, No License Plate", mode),
}
},
}
}
fn main() {
let person_clothing = PersonAspect::Clothing {
style: String::from("Casual"),
size: String::from("M")
};
let person_food = PersonAspect::Food {
meal_type: String::from("Lunch"),
calories: 600
};
let person_residence = PersonAspect::Residence {
address: String::from("123 Main St"),
square_meters: 85
};
let person_transportation = PersonAspect::Transportation {
mode: String::from("Car"),
license_plate: Some(String::from("ABC-1234"))
};
describe_person_aspect(person_clothing);
describe_person_aspect(person_food);
describe_person_aspect(person_residence);
describe_person_aspect(person_transportation);
}
控制流 ✨✨✨✨✨✨✨
- if let
/*
Option是有和无的抽象,其中Some可以传入任何类型,任何事物都可以是有或者无。
pub enum Option<T> {
None,
Some(T),
}
*/
let config_max = Some(3u8);
match config_max {
Some(max) => println!("The maximum is configured to be {}", max),
_ => (),
}
//当枚举只有两种情况是可以使用-- if let
let config_max = Some(3u8);
if let Some(max) = config_max {
println!("The maximum is configured to be {}", max)
}
reference:https://kaisery.github.io/trpl-zh-cn/ //rust 圣经