rust复习笔记4

泛型

当使用泛型定义函数时,我们在函数签名中通常为参数和返回值指定数据类型的位置放置泛型。以这种方式编写的代码将更灵活并能向函数调用者提供更多功能,同时不引入重复代码。 

泛型可以用于结构体,枚举,结构体方法。

结构体定义中的泛型类型参数并不总是与结构体方法签名中使用的泛型是同一类型。

trait

trait 告诉 Rust 编译器某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。

impl trait名 for 类型名

trait 体中可以有多个方法:一行一个方法签名且都以分号结尾。可以为trait提供默认实现

本地类型可以实现外部trait,但是不能为外部类型实现外部 trait

trait 可以作为函数参数,arg:impl trait名1[+trait名2]

通过where简化trait bound的缺点,eg:

fn some_function<T: Display + Clone, U: Clone + Debug>(t: T, u: U) -> i32 {

}

也可以写作:

fn some_function<T, U>(t: T, u: U) -> i32

              where T: Display + Clone,

              U: Clone + Debug {

}

trait也可以做返回值:impl  trait名,不过这只适用于返回单一类型的情况

trait 可以与泛型结合来将泛型限制为拥有特定行为的类型,而不是任意类型。

这里还有一种泛型,我们一直在使用它甚至都没有察觉它的存在,这就是 生命周期lifetimes)。不同于其他泛型帮助我们确保类型拥有期望的行为,生命周期则有助于确保引用在我们需要他们的时候一直有效。

生命周期

Rust 关于参数中的引用和返回值之间的限制是他们都必须拥有相同的生命周期

省略规则并不提供完整的推断:如果 Rust 在明确遵守这些规则的前提下变量的生命周期仍然是模棱两可的话,它不会猜测剩余引用的生命周期应该是什么。

编译器采用三条规则来判断引用何时不需要明确的注解。第一条规则适用于输入生命周期,后两条规则适用于输出生命周期。如果编译器检查完这三条规则后仍然存在没有计算出生命周期的引用,编译器将会停止并生成错误。

这些规则适用于 fn 定义,以及 impl 块。

第一条规则是每一个是引用的参数都有它自己的生命周期参数。换句话说就是,有一个引用参数的函数有一个生命周期参数:fn foo<'a>(x: &'a i32),有两个引用参数的函数有两个不同的生命周期参数,fn foo<'a, 'b>(x: &'a i32, y: &'b i32),依此类推。

第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:fn foo<'a>(x: &'a i32) -> &'a i32

第三条规则是如果方法有多个输入生命周期参数,不过其中之一因为方法的缘故为 &self 或 &mut self,那么 self 的生命周期被赋给所有输出生命周期参数。这使得方法更容易读写,因为只需更少的符号。

方法定义中的生命周期注解

当为带有生命周期的结构体实现方法时,其语法泛型类型参数的语法。声明和使用生命周期参数的位置依赖于生命周期参数是否同结构体字段或方法参数和返回值相关。

(实现方法时)结构体字段的生命周期必须总是在 impl 关键字之后声明并在结构体名称之后被使用,因为这些生命周期是结构体类型的一部分。

这里有一种特殊的生命周期值得讨论:'static,其生命周期存活于整个程序期间。所有的字符串字面值都拥有 'static 生命周期

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值