学习rust(四)泛型及特征
类型-泛型和特征
1 类型系统及其重要性
类型系统:表达能力,编译时的检查
2 泛型
创建泛型
- Vect
- 泛型函数 fn f1
(val :T) - 泛型结构体struct Con
泛型应用
3 用特征抽象行为 trait
trait理解为其他语言的接口,但是可以实现方法,可以注解注入
impl xxx fo yyy{}
特征的表现形式
- 标记特征 std::maker里面的 copy send sync
- 简单特征
- 泛型特征
- 关联类型特征
trait Foo{
type Out;
}
- 继承特征
4 特征区间
特征区间
#1
fn xx<T:xx> (){}
#2 where
impl<T> xx for YY<T> where T: Q+P
特征支持继承 traitA:B+C+D{}
5 标准库特征简介
[derive(Default)]
Debug, PartialEq Eq Copy Clone
std::ops std::convert
6 使用特征对象实现真正的多态性
特征多态
- 静态分发
- 动态分发
特征对象:胖指针
dyn trait引用对象
use std::fmt::Display;
use std::fmt::Debug;
fn main() {
println!("Hello, world!");
let a = 1024;
give_me(a);
}
#[derive(Debug)]
struct Square(f32);
#[derive(Debug)]
struct Rectangle(f32, f32);
trait Area: Debug {
fn get_area(&self) -> f32;
}
impl Area for Square {
fn get_area(&self) -> f32 {
self.0 * self.0
}
}
impl Area for Rectangle {
fn get_area(&self) -> f32 {
self.0 * self.1
}
}
let shapes: Vec<&dyn Area> = vec![&Square(3f32), &Rectangle(4f32, 2f32)];
for s in shapes {
println!("{:?}", s);
}
fn surround_with_braces(val: impl Display) -> impl Display {
format!("{{{}}}", val)
}
struct Foo<T:Display>{
bar:T
}
struct Bar<F> where F:Display{
inner:F
}
trait Test1{
fn test1(&self);
}
trait Playable:Test1{
fn play(&self);
fn pause(){
println!("Paused");
}
}
struct Audio(String);
impl Playable for Audio{
fn play(&self){
println!("now playing: {}", self.0);
}
}
impl Test1 for Audio{
fn test1(&self){
println!("test1: {}", self.0);
}
}
fn give_me<T>(val :T){
let _ = val;
}
struct ContIt<T>{
item:T
}
impl <T> ContIt<T>{
fn new(i:T)->Self{
ContIt{item:i}
}
}
enum Trans<T>{
Signal(T),
NoSignal
}