rust ABC (二)生命周期和泛型

rust ABC (二)生命周期和泛型

rust 由于通过内存管理保证了内存安全,因此对于变量引入了生命周期机制的机制。同时虽然rust不是面向对象的语言,通过Trait机制保证了封装与继承的实现方式,可以说是和其他语言有一定区别,但是又进一步通过更先进的实现方式,达到了更好的实现效果。

生命周期和泛型

Rust 生命周期的设计目的是为了保证内存安全,其具体学习的方式可以完全类比泛型

生命周期的声明和泛型完全相同,函数如下声明如下

fn any_to_string<'a,'b,T>(some_string: &'a T) -> &'b T
where
    'a:'b,
    'a:'static,
    T: ToString + ?Sized,
{
    some_string.to_string();
    let s = some_string;
    s
}

类比如下

  泛型 生命周期
声明方式 在<> 内部声明 在<> 内部声明
作用关系 在where 中声明 在where 中声明
作用 T: ToString 表示 T 都是 String类型,都有 ToString 的 Trait ,类比继承也就是 String 是 T 的父类 ‘a:’b 表示 b 的生命周期比a长,可以类比成 b 是 a 的父类
any 最大的父类 'static 表示内存保存在永久区中,拥有最长的生命周期,也可以理解成最大的父类

同时生命周期可以缩写,以下两种生命的是相同的

fn do_something_2<'a,'b>(some_string: &'a mut str) -> &'b str 
    where
    'a:'b,
{
    let s = some_string.trim();
    s
}

fn do_something_3<'a:'b,'b>(some_string: &'a mut str) -> &'b str {
    let s = some_string.trim();
    s
}

特性(Trait)

特性是一种类似于继承的的语言能力,和继承的区别就是他是一种组合方式,简单来说就是 A is a BA has a B 的区别

特性的使用方式,一下一个例子说明,汽车有轮子就能够驾驭

#[derive(Debug)]
struct Car {
    driver: i32,
}

trait Drive {
    fn wheel(&self);
}

impl Drive for Car {
    fn wheel(&self) {
        println!("{}", self.driver);
    }
}
Box 和 dyn

如果想要获取到特性对象,就使用智能指针和 dyn 关键字获取,例如 Box<dyn Animal>

struct Sheep {}
struct Cow {}

trait Animal {
    // 实例方法签名
    fn noise(&self) -> &'static str;
}

// 实现 `Sheep` 的 `Animal` trait。
impl Animal for Sheep {
    fn noise(&self) -> &'static str {
        "baaaaah!"
    }
}

// 实现 `Cow` 的 `Animal` trait。
impl Animal for Cow {
    fn noise(&self) -> &'static str {
        "moooooo!"
    }
}

// 返回一些实现 Animal 的结构体,但是在编译时我们不知道哪个结构体。
fn random_animal(random_number: f64) -> Box<dyn Animal> {
    if random_number < 0.5 {
        Box::new(Sheep {})
    } else {
        Box::new(Cow {})
    }
}