Rust语言 学习09 泛型 Trait 生命周期
  dBFTbkVLMBge 2023年11月02日 66 0

一、提取函数消除重复

Rust语言 学习09  泛型 Trait 生命周期_生命周期

Rust语言 学习09  泛型 Trait 生命周期_生命周期_02

// 定义max函数
fn getMax(list: &[i32]) -> i32 {
    let mut largest = list[0];
    for &item in list { // 模式匹配  item就是i32类型了
        if item > largest {
            largest = item;
        }
    }
    // 或者使用 *解引用也行 获取值
    for item in list {
        if *item > largest{
            largest = *item;
        }
    }
    return largest;
}

fn main() {
    let old_list = vec![10,20,30,40,50];
    let new_list = vec![60,70,80,90,100];
    println!("max of old_list is {}",getMax(&old_list));
    println!("max of new_list is {}",getMax(&new_list))
}

Rust语言 学习09  泛型 Trait 生命周期_生命周期_03

二、泛型

Rust语言 学习09  泛型 Trait 生命周期_生命周期_04

Rust语言 学习09  泛型 Trait 生命周期_生命周期_05

Rust语言 学习09  泛型 Trait 生命周期_生命周期_06

struct Point<T,U> {
    x:T,
    y:U,
}
fn main() {
    let p1 = Point{x:5,y:10};
    let p2 = Point{x:1.0,y:4.0};
}

Rust语言 学习09  泛型 Trait 生命周期_生命周期_07

Rust语言 学习09  泛型 Trait 生命周期_生命周期_08


Rust语言 学习09  泛型 Trait 生命周期_生命周期_09

struct Point<T> {
    x:T,
    y:T,
}
impl <T> Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
}

impl  Point<i32> {
    fn x1(&self) -> &i32 {
        &self.x
    }
}

fn main() {
    let p = Point{x:5,y:10};
    println!("p.x={}",p.x());
}
struct Point<T,U> {
    x:T,
    y:U,
}
impl<T,U> Point<T,U> {
    fn mixup<V,W> (self,other:Point<V,W>) -> Point<T,W> {
        Point {
            x:self.x,
            y:other.y,
        }
    }
}

fn main() {
    let p1 = Point{x:5,y:4};
    let p2 = Point{x:"hello",y:'c'};
    let p3 = p1.mixup(p2);
    println!("p3.x={} ,p3.y={}",p3.x,p3.y);
}

Rust语言 学习09  泛型 Trait 生命周期_生命周期_10

Rust语言 学习09  泛型 Trait 生命周期_生命周期_11

fn main() {
    let integer = Some(5);
    let float = Some(5.1);
}

三、Trait

Rust语言 学习09  泛型 Trait 生命周期_生命周期_12

Rust语言 学习09  泛型 Trait 生命周期_生命周期_13

// 定义trait
pub trait Summary {
    fn summarize(&self) -> String;
}

pub struct NewsArticle {
    pub headline:String,
    pub content:String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{} {} ", self.headline,self.content);
    }
}

Rust语言 学习09  泛型 Trait 生命周期_生命周期_14

Rust语言 学习09  泛型 Trait 生命周期_生命周期_15

Trait作为参数

Rust语言 学习09  泛型 Trait 生命周期_生命周期_16

Rust语言 学习09  泛型 Trait 生命周期_生命周期_17

实现了两个trait Summary和Display

Rust语言 学习09  泛型 Trait 生命周期_生命周期_18

Rust语言 学习09  泛型 Trait 生命周期_生命周期_19

Rust语言 学习09  泛型 Trait 生命周期_生命周期_20

Rust语言 学习09  泛型 Trait 生命周期_生命周期_21

Rust语言 学习09  泛型 Trait 生命周期_生命周期_22

Rust语言 学习09  泛型 Trait 生命周期_生命周期_23

Rust语言 学习09  泛型 Trait 生命周期_生命周期_24

Rust语言 学习09  泛型 Trait 生命周期_生命周期_25

Rust语言 学习09  泛型 Trait 生命周期_生命周期_26

Rust语言 学习09  泛型 Trait 生命周期_生命周期_27

四、生命周期

Rust语言 学习09  泛型 Trait 生命周期_生命周期_28

Rust语言 学习09  泛型 Trait 生命周期_生命周期_29

fn main() {
    {
        let r;
        {
            let x = 5;
            r = &x;
        }
        println!("r:{}",r); // x离开作用域 内存已经释放 报错
    }
    
}

Rust语言 学习09  泛型 Trait 生命周期_生命周期_30

Rust语言 学习09  泛型 Trait 生命周期_生命周期_31

Rust语言 学习09  泛型 Trait 生命周期_生命周期_32

fn longest(x:&str,y:&str) -> &str { 
    if x.len() > y.len() {
        x
    } else {
        y
    }

}
fn main() {
    let string1 = String::from("abcd");
    let string2 = "xyz";
    let result = longest(string1.as_str(),string2);
    println!("longest str is {}",result);
}

Rust语言 学习09  泛型 Trait 生命周期_生命周期_33

函数返回值包括一个借用值,但是签名没有说是从x还是y借用的

考虑引用一个named lifetime 命名生命周期参数解决

修改代码如下

// 两个引用的生命周期和泛型是一样的
fn longest<'a>(x:&'a str,y:&'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }

}
fn main() {
    let string1 = String::from("abcd");
    let string2 = "xyz";
    let result = longest(string1.as_str(),string2);
    println!("longest str is {}",result);
}


Rust语言 学习09  泛型 Trait 生命周期_生命周期_34

Rust语言 学习09  泛型 Trait 生命周期_生命周期_35

Rust语言 学习09  泛型 Trait 生命周期_生命周期_36

Rust语言 学习09  泛型 Trait 生命周期_生命周期_37

Rust语言 学习09  泛型 Trait 生命周期_生命周期_38

Rust语言 学习09  泛型 Trait 生命周期_生命周期_39

Rust语言 学习09  泛型 Trait 生命周期_生命周期_40

Rust语言 学习09  泛型 Trait 生命周期_生命周期_41

Rust语言 学习09  泛型 Trait 生命周期_生命周期_42

修改代码如下

Rust语言 学习09  泛型 Trait 生命周期_生命周期_43

Rust语言 学习09  泛型 Trait 生命周期_生命周期_44

struct ImportantExcerpt<'a> {
    part : &'a str,
}

fn main() {
    let novel = String::from("some years ago...");
    let first_sentence = novel.split('.')
                              .next()
                              .expect("cannot find");
    let i = ImportantExcerpt {
        part: first_sentence
    };
}

Rust语言 学习09  泛型 Trait 生命周期_生命周期_45

Rust语言 学习09  泛型 Trait 生命周期_生命周期_46

Rust语言 学习09  泛型 Trait 生命周期_生命周期_47

Rust语言 学习09  泛型 Trait 生命周期_生命周期_48

Rust语言 学习09  泛型 Trait 生命周期_生命周期_49

Rust语言 学习09  泛型 Trait 生命周期_生命周期_50

Rust语言 学习09  泛型 Trait 生命周期_生命周期_51

struct ImportantExcerpt<'a> {
    part : &'a str,
}

impl <'a> ImportantExcerpt<'a> {
    fn level(&self) -> i32 {
        3
    }

    fn announce(&self,announcement:&str) -> &str {
       println!("attention:{}",announcement);
       self.part
    }
}

fn main() {
    let novel = String::from("some years ago...");
    let first_sentence = novel.split('.')
                              .next()
                              .expect("cannot find");
    let i = ImportantExcerpt {
        part: first_sentence
    };
}

Rust语言 学习09  泛型 Trait 生命周期_生命周期_52

Rust语言 学习09  泛型 Trait 生命周期_生命周期_53

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

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

暂无评论

dBFTbkVLMBge