栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Rust语言——泛型、Trait、生命周期

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Rust语言——泛型、Trait、生命周期

泛型

泛型:提高代码复用能力

泛型函数:

—参数类型

—返回类型

fn main(){
    let v = vec![100, 21, 352, 61, 5];
    println!("The largest num is {}", largest(&v));
    println!("{:?}", v);
}
fn largest(v:&Vec)->T{
    let mut large = v[0];
    for i in v.iter(){
        if *i>large {//某些情况下不能进行大小比较
            large = *i;
        }
    }
    large 
}

Struct中使用泛型

struct Point{
    x:T,
    y:T,
    z:String,
}
struct P{
    x:T,
    y:U,
    z:String,
}

enum中使用泛型

enum Xzc{
    x(T),
    y(U),
    z(T, U, String, T),
}

方法中使用泛型

impl Point{//impl后加T表示在类型T上实现方法
    fn p(&self)->&T{
        &self.x
    }
}

Trait

 把方法签名放在一起,来定义实现某种目的所必需的一组行为

关键字:trait

只有方法签名,没有具体实现

trait Summary{
    fn xzc(&self)->String;
    fn xz()->i32;
    fn x(&self)->i32;
}

在类型上实现trait

trait Summary{
    fn xzc(&self)->String;
    fn xz()->i32;
    fn x(&self)->i32;
}
struct Tweet{
    name:String,
    reply:bool,
    retweet:bool,
}
impl Summary for Tweet{
    fn xzc(&self)->String{
        format!("{}-{}", self.name, self.reply)
    }
    fn xz()->i32{
        22
    }
    fn x(&self)->i32{
        18
    }
}
println!("{}", Tweet::xz());
println!("{}", tweet.xzc());

impl trait语法:可以作为函数的参数类型

fn impl_trait(item:impl Summary)->i32{
    item.x()
}
println!("{}", impl_trait(tweet));

trait bound:适用于复杂的情况

fn impl_trait(item:T){
    item.x();
}

使用+指定多个trait bound

生命周期

fn main(){
    let r;
    {
        let a = 5;
        r = &a;//报错 r生命周期比a长 r所指向的a在第七行已经消失了,所以提前报错
    }
    println!("{}", r);
}
fn main(){
    let r;
    let a = 5;
    r = &a;
    println!("{}", r);//解决方法 让a一直陪伴着r
}
fn compare(s1:&str, s2:&str)->&str{//报错因为生命周期无法被确定
    if s1.len()>s2.len() {
        s1
    }
    else{
        s2
    }
}

解决方法:使生命周期标记为一致的

fn compare<'a>(s1:&'a str, s2:&'a str)->&'a str{
    if s1.len()>s2.len() {
        s1
    }
    else{
        s2
    }
}

'a为生命周期标注,上述代码中的'a是s1和s2中比较短的生命周期

在方法中标记生命周期与在方法中使用泛型类似

struct Point<'a>{
    name:&'a String,
    age:i32,
}
impl<'a> Point<'a>{
    fn xzc(&self)->&String{//self和String可以通过上一行来判断出自己的生命周期,所以省略
        &self.name
    }
}

静态生命周期

'static是一个特殊的生命周期:整个程序的持续时间(从头到尾,一直可用)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737446.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号