Rust语言 学习03 所有权 && 引用 && 切片
  dBFTbkVLMBge 2023年11月02日 44 0

一、所有权的定义

Rust语言 学习03 所有权 && 引用 && 切片_所有权

Rust语言 学习03 所有权 && 引用 && 切片_所有权_02

降低编译速度,检查规则

Rust语言 学习03 所有权 && 引用 && 切片_所有权_03

Rust语言 学习03 所有权 && 引用 && 切片_所有权_04

Rust语言 学习03 所有权 && 引用 && 切片_所有权_05

Rust语言 学习03 所有权 && 引用 && 切片_所有权_06

Rust语言 学习03 所有权 && 引用 && 切片_所有权_07

二、所有权的规则 内存与分配

Rust语言 学习03 所有权 && 引用 && 切片_所有权_08

Rust语言 学习03 所有权 && 引用 && 切片_所有权_09

Rust语言 学习03 所有权 && 引用 && 切片_所有权_10

Rust语言 学习03 所有权 && 引用 && 切片_所有权_11

Rust语言 学习03 所有权 && 引用 && 切片_所有权_12

fn main() {
   let mut s = String::from("hello");
   s.push_str(",World");
   println!("{}",s)
}

Rust语言 学习03 所有权 && 引用 && 切片_所有权_13

Rust语言 学习03 所有权 && 引用 && 切片_所有权_14

类似于Java中的StringBuilder和StringBuffer

Rust语言 学习03 所有权 && 引用 && 切片_所有权_15

Rust语言 学习03 所有权 && 引用 && 切片_所有权_16

Rust语言 学习03 所有权 && 引用 && 切片_所有权_17

Rust语言 学习03 所有权 && 引用 && 切片_所有权_18

Rust语言 学习03 所有权 && 引用 && 切片_所有权_19

Rust语言 学习03 所有权 && 引用 && 切片_所有权_20

Rust语言 学习03 所有权 && 引用 && 切片_所有权_21

Rust语言 学习03 所有权 && 引用 && 切片_所有权_22

Rust语言 学习03 所有权 && 引用 && 切片_所有权_23

fn main() {
    let s1 = String::from("Hello");
    let s2 = s1.clone();
    println!("{} {}",s1,s2);
}

Rust语言 学习03 所有权 && 引用 && 切片_所有权_24

Rust语言 学习03 所有权 && 引用 && 切片_所有权_25

Rust语言 学习03 所有权 && 引用 && 切片_所有权_26

Rust语言 学习03 所有权 && 引用 && 切片_所有权_27

数据完成了复制

Rust语言 学习03 所有权 && 引用 && 切片_所有权_28

三、所有权与函数

Rust语言 学习03 所有权 && 引用 && 切片_所有权_29

fn main() {
    let s = String::from("hello world");
    take_ownership(s);

    let x = 5;
    makes_copy(x);
    println!("{}",x)
}

fn take_ownership(param:String) {
    println!("{}",param);
}

fn makes_copy(num:i32) {
    println!("{}",num);
}

字符串String是传引用,变量x是传值

Rust语言 学习03 所有权 && 引用 && 切片_所有权_30

Rust语言 学习03 所有权 && 引用 && 切片_所有权_31

Rust语言 学习03 所有权 && 引用 && 切片_所有权_32

Rust语言 学习03 所有权 && 引用 && 切片_所有权_33

四、引用和借用

fn main() {
    let s1 = String::from("hello");
    let len = calculate_len(&s1);
    print!("length:{}",len);
}

fn calculate_len(s:&String) -> usize {
    s.len()
}

Rust语言 学习03 所有权 && 引用 && 切片_所有权_34

Rust语言 学习03 所有权 && 引用 && 切片_所有权_35

Rust语言 学习03 所有权 && 引用 && 切片_所有权_36

使用可变引用即可

Rust语言 学习03 所有权 && 引用 && 切片_所有权_37

Rust语言 学习03 所有权 && 引用 && 切片_所有权_38

Rust语言 学习03 所有权 && 引用 && 切片_所有权_39

Rust语言 学习03 所有权 && 引用 && 切片_所有权_40

Rust语言 学习03 所有权 && 引用 && 切片_所有权_41

Rust语言 学习03 所有权 && 引用 && 切片_所有权_42

类似于读写锁一样的原理,读锁之间是共享的,但是读和写锁之间是互斥

Rust语言 学习03 所有权 && 引用 && 切片_所有权_43

Rust语言 学习03 所有权 && 引用 && 切片_所有权_44

Rust语言 学习03 所有权 && 引用 && 切片_所有权_45

五、切片

Rust语言 学习03 所有权 && 引用 && 切片_所有权_46

fn main() {
   let mut s = String::from("Hello world");
   let wordIndex = first_word(&s);
   println!("{}",wordIndex);
}


fn first_word(s:&String) -> usize {
   let bytes = s.as_bytes();
   for (i,&item) in bytes.iter().enumerate() {
       if item == b' ' {
          return i;
       }
   }
   return s.len()
}

Rust语言 学习03 所有权 && 引用 && 切片_所有权_47

Rust语言 学习03 所有权 && 引用 && 切片_所有权_48

fn main() {
    let s = String::from("Hello,world");
    /*let s1 = &s[0..5];
    let s2 = &s[6..11];*/
    let s1 = &s[..5];
    let s2 = &s[6..];
    let whole = &s;
    println!("{} {} ",s1,s2);
    println!("{}",whole)
}

Rust语言 学习03 所有权 && 引用 && 切片_所有权_49

Rust语言 学习03 所有权 && 引用 && 切片_所有权_50

fn main() {
   let mut s = String::from("Hello world");
   let wordIndex = first_word(&s);
   println!("{}",wordIndex);
}


fn first_word(s:&String) -> &str {
    let bytes = s.as_bytes();
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[..i];
        }
    }
    return s;
}

Rust语言 学习03 所有权 && 引用 && 切片_所有权_51

Rust语言 学习03 所有权 && 引用 && 切片_所有权_52

Rust语言 学习03 所有权 && 引用 && 切片_所有权_53



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
dBFTbkVLMBge