美文网首页rust
rust学习总结-3

rust学习总结-3

作者: robertzhai | 来源:发表于2022-03-02 23:00 被阅读0次

    _占位符

    • 忽略该值或者类型,类似go中的
    • 使用下划线开头忽略未使用的变量, 不会产生警告
    • _x 仍会将值绑定到变量,会发生所有权转义move,而 _ 则完全不会绑定。

    .. 忽略剩余值

    struct Point {
        x: i32,
        y: i32,
        z: i32,
    }
    
    let origin = Point { x: 0, y: 0, z: 0 };
    
    match origin {
        Point { x, .. } => println!("x is {}", x),
    }
    

    流程控制

    • 分支控制(if, else, else if )
    • 循环控制( for、while 和 loop)
    • 跳出(break), break 可以单独使用,也可以带一个返回值,有些类似 return
    • 跳过当前当次的循环,开始下次的循环(continue)
    • loop 是一个表达式,因此可以返回一个值
    fn main() {
        let mut counter = 0;
    
        let result = loop {
            counter += 1;
    
            if counter == 10 {
                break counter * 2;
            }
        };
    
        println!("The result is {}", result);
    }
    

    模式匹配

    • match,类似switch, 需要穷尽匹配
    • if let, 当你只要匹配一个条件,且忽略其他条件时
    • matches!,它可以将一个表达式跟模式进行匹配,然后返回匹配的结果 true or false
    • 匹配守卫(match guard)是一个位于 match 分支模式之后的额外 if 条件,它能为分支模式提供更进一步的匹配条件

    Option

    enum Option<T> {
        Some(T),
        None,
    }
    
    • 一个变量要么有值:Some(T), 要么为空:None
    方法
    • 可以为结构体、枚举和特征(trait)实现方法
    • 使用 impl 来定义方法,允许我们为一个结构体定义多个 impl 块
    • 方法签名 self

    self 表示 所有权转移到该方法中,这种形式用的较少
    &self 表示不可变借用
    &mut self 表示可变借用

    • 允许方法名跟结构体的字段名相同
    • 返回 Self,表示对象本身,和返回对象一样的含义
    • Rust 中有一个约定俗称的规则,使用 new 来作为构造器的名称
    • :: 语法用于关联函数和模块创建的命名空间

    泛型(可以使用泛型来编写不重复的代码)

    • 函数
    fn add<T: std::ops::Add<Output = T>>(a: T, b: T) -> T {
        a + b
    }
    
    fn main() {
        println!("add i8: {}", add(2i8, 3i8));
        println!("add i32: {}", add(20, 30));
        println!("add f64: {}", add(1.23, 1.23));
    }
    
    • 结构体
    #[derive(Debug)]
    #[allow(dead_code)]
    struct Point<T> {
        x: T,
        y: T,
    }
    
    struct Point2<T, U> {
        x: T,
        y: U,
    }
    
    impl<T, U> Point2<T, U> {
        fn mixup<V, W>(self, other: Point2<V, W>) -> Point2<T, W> {
            Point2 {
                x: self.x,
                y: other.y,
            }
        }
    }
    fn main() {
        let integer = Point { x: 5, y: 10 };
        let float = Point { x: 1.0, y: 4.0 };
        println!("{:?}", integer);
        println!("{:?}", float);
        let p1 = Point2 { x: 5, y: 10.4 };
        let p2 = Point2 { x: "Hello", y: 'c' };
    
        let p3 = p1.mixup(p2);
    
        println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
    }
    
    
    • 枚举
    enum Option<T> {
        Some(T),
        None,
    }
    
    enum Result<T, E> {
        Ok(T),
        Err(E),
    }
    
    • Rust 中泛型是零成本的抽象,意味着你在使用泛型时,完全不用担心性能上的问题
    • Rust 是在编译期为泛型对应的多个类型,生成各自的代码,因此损失了编译速度和增大了最终生成文件的大小
    • Rust 通过在编译时进行泛型代码的 单态化(monomorphization)来保证效率。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。编译器所做的工作正好与我们创建泛型函数的步骤相反,编译器寻找所有泛型代码被调用的位置并针对具体类型生成代码。

    特征 Trait

    • 类似go中的interface
    • 如果不同的类型具有相同的行为,那么我们就可以定义一个特征,然后为这些类型实现该特征
    pub trait Summary {
        fn summarize(&self) -> String;
    }
    pub struct Post {
        pub title: String, // 标题
        pub author: String, // 作者
        pub content: String, // 内容
    }
    // Post 类型实现 Summary 特征
    impl Summary for Post {
        fn summarize(&self) -> String {
            format!("文章{}, 作者是{}", self.title, self.author)
        }
    }
    
    pub struct Weibo {
        pub username: String,
        pub content: String
    }
    
    impl Summary for Weibo {
        fn summarize(&self) -> String {
            format!("{}发表了微博{}", self.username, self.content)
        }
    }
    
    • 默认实现,这样其它类型无需再实现该方法,或者也可以选择重载该方法
    pub trait Summary {
        fn summarize(&self) -> String {
            String::from("(Read more...)")
        }
    }
    
    • 使用特征作为函数参数 和 返回值
    pub fn notify(item: &impl Summary) {
        println!("Breaking news! {}", item.summarize());
    }
    pub fn notify(item1: &impl Summary, item2: &impl Summary) {}
    fn returns_summarizable(switch: bool) -> impl Summary {
        if switch {
            Post {
                title: String::from(
                    "Penguins win the Stanley Cup Championship!",
                ),
                author: String::from("Iceburgh"),
                content: String::from(
                    "The Pittsburgh Penguins once again are the best \
                     hockey team in the NHL.",
                ),
            }
        } else {
            Weibo {
                username: String::from("horse_ebooks"),
                content: String::from(
                    "of course, as you probably already know, people",
                ),
            }
        }
    }
    
    • derive 派生特征

    [derive(Debug)], 用于{:?}格式化输出结构体

    特征 对象

    pub trait Draw {
        fn draw(&self);
    }
    
    
    pub struct Button {
        pub width: u32,
        pub height: u32,
        pub label: String,
    }
    
    impl Draw for Button {
        fn draw(&self) {
            // 绘制按钮的代码
        }
    }
    
    struct SelectBox {
        width: u32,
        height: u32,
        options: Vec<String>,
    }
    
    impl Draw for SelectBox {
        fn draw(&self) {
            // 绘制SelectBox的代码
        }
    }
    

    Self与self

    • self指代当前的实例对象
    • Self指代特征或者方法类型的别名
    trait Draw {
        fn draw(&self) -> Self;
    }
    
    #[derive(Clone)]
    struct Button;
    impl Draw for Button {
        fn draw(&self) -> Self {
            return self.clone()
        }
    }
    
    fn main() {
        let button = Button;
        let newb = button.draw();
    }
    self指代的就是当前的实例对象,也就是 button.draw() 中的 button 实例,Self 则指代的是 Button 类型
    

    Lint levels(静态代码分析)

    lint是静态代码分析工具,其不仅可以检查程序中可移植性问题,还可以检查符合语法规则但可能是出现错误逻辑的代码。

    • allow

    [allow(dead_code)]

    • warn(default)
    • force-warn
    • deny
    • forbid
    参考

    相关文章

      网友评论

        本文标题:rust学习总结-3

        本文链接:https://www.haomeiwen.com/subject/aajhrrtx.html