zoukankan      html  css  js  c++  java
  • 【Rust】特质trait

    环境

    • Rust 1.56.1
    • VSCode 1.61.2

    概念

    参考:https://doc.rust-lang.org/rust-by-example/trait.html

    示例

    trait 一般翻译成特质,之后的内容不翻译,类似其它语言中的接口。

    main.rs

    struct Sheep {
        naked: bool,
        name: &'static str,
    }
    
    trait Animal {
        // Self 表示实现的类型,注意关联函数和方法的区别
        fn new(name: &'static str) -> Self;
        fn name(&self) -> &str;
        fn noise(&self) -> &str;
        // 可以进行默认实现
        fn talk(&self) {
            println!("{} says {}", self.name(), self.noise());
        }
    }
    
    impl Sheep {
        fn is_naked(&self) -> bool {
            self.naked
        }
    
        fn shear(&mut self) {
            if self.is_naked() {
                println!("{} is already naked...", self.name());
            } else {
                println!("{} gets a haircut!", self.name);
                self.naked = true;
            }
        }
    }
    
    impl Animal for Sheep {
        fn new(name: &'static str) -> Sheep {
            Sheep {
                name: name,
                naked: false,
            }
        }
    
        fn name(&self) -> &str {
            self.name
        }
    
        fn noise(&self) -> &str {
            if self.is_naked() {
                "baaaaah?"
            } else {
                "baaaaah!"
            }
        }
    
        fn talk(&self) {
            // 可以覆盖默认的方法
            println!("{} pauses briefly... {}", self.name, self.noise());
        }
    }
    
    fn main() {
        // 类型注解必须要
        let mut dolly: Sheep = Animal::new("Dolly");
    
        dolly.talk();
        dolly.shear();
        dolly.talk();
    }
    

    总结

    了解了 Rust 中 trait 的定义方式和实现方式。

    附录

  • 相关阅读:
    typora 页内跳转
    shell脚本搭建redis集群
    Html
    python json模块
    jenkins 问题合集
    day05 每日一行
    day04 每次一行
    day03 每日一行
    day02
    day02 每日一行
  • 原文地址:https://www.cnblogs.com/jiangbo44/p/15724683.html
Copyright © 2011-2022 走看看