随便学RUST- 02所有权

让学习快乐起来

注释 ✨✨✨

  1. // 这是一条注释 语法跟 go是一样的

所有权和借用 (crud是很重要的)✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

  1. 让我们这样去思考,我们如何管理一个值呢?crud??
    是的,在rust中我们需要管理值的crud!!!!

  2. 值只有值的owner可以删除值,或者换句话说,值是一个资源,有两个角色可以管理它,owenr和borrower。
    owenr(所有权): 对值进行增删改查
    borrower(借用者): 读写的权利,但是无权删除 read borrow

  • 如果这个时候你思考,那如果一个值正在借用它,但是他被owner干掉了,这可咋办???(这是最自然而然的问题吧)
    答案是:rust 不允许!
    这触发了借用规则: 值在任一时刻只有一个可变应用或者多个不可变应用。通俗点:只允许有一个人可以修改它,其他人只能读。所有者和借用者都能修改这个值,这是不允许发生的。

  • ps: 如果你觉得可能会出现安全问题,或者说满脑子疑惑???那就去问gpt吧。

函数 ✨✨✨✨✨

  1. 函数很简单,因为难的我不讲
    // 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,
}

方法 ✨✨✨✨✨

  1. 为了给结构体实现方法,使用impl 块
  2. 方法有三种,实例方法,关联函数(静态方法,或者说类方法)
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);
}

控制流 ✨✨✨✨✨✨✨

  1. 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 圣经

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值