1. 程式人生 > 其它 >Rust基礎06-結構體

Rust基礎06-結構體

Struct 例項

  • 計算長方形面積

    #[derive(Debug)]
    struct Rectangle {
        width: u32,
        length: u32,
    }
    
    fn main() {
        let rect = Rectangle {
            width: 30,
            length: 50,
        };
    
        println!("{}", area(&rect));
    
        println!("{:#?}", rect);
    }
    
    fn area(rect: &Rectangle) -> u32 {
        rect.width * rect.length
    }
    

    在上述程式碼中,如果我們直接使用println!("{}", rect);來列印 Rectangle 例項,程式會報錯,見下:

    error[E0277]: `Rectangle` doesn't implement `std::fmt::Display`
    

    相關解釋見圖:

    因此,我們在程式中使用println!("{:#?}", rect);來實現列印 Rectangle 例項,在程式第一行寫下#[derive(Debug)]

    相關解釋見圖:

更多相關資訊見:

使用結構體的程式碼例子

Struct 方法

  • 方法與函式

    相似:fn 關鍵字、名稱、引數、返回值
    不同:

    1. 方法是在 struct (或 enum、trait 物件) 的上下文中定義
    2. 第一個引數為 self,表示方法被呼叫的 struct 例項
  • 定義方法:

    在 impl 塊中定義方法

    方法的第一個引數可以是 &self,也可以獲得其所有權 或 可變借用,與其他引數一樣

    //例項:長方體面積
    #[derive(Debug)]
    struct Rectangle {
        width: u32,
        length: u32,
    }
    //定義方法
    impl Rectangle {
        fn area(&self) -> u32 {
            self.width * self.length
        }
    }
    
    fn main() {
        let rect = Rectangle {
            width: 30,
            length: 50,
        };
    
        println!("{}", rect.area());
    
        println!("{:#?}", rect);
    }
    
  • 方法呼叫運算子:

    在 C/C++ 中,我們可以通過如下呼叫方法:

    object -> something()
    (*object).something()
    

    在 Rust 中,沒有 -> 運算子,但 Rust 會自動引用或解引用

    在呼叫方法時就會發生這種行為,Rust 根據情況自動新增 &、&mut 或 ,以便 object 可以匹配方法的簽名

    p1.distance(&p2);
    (&p1).distance(&p2);
    
  • 關聯函式:

    可以在 impl 塊中定義不把 self 作為第一個引數的函式,它們叫關聯函式(不是方法)

    如:String::from()

    關聯函式通常用於構造器

    //例項:長方形體積->impl中定義的關聯函式
    fn square(size: u32) -> Rectangle {
            Rectangle {
                width: size,
                length: size
            }
        }
    
  • impl 塊:

    每個 struct 允許擁有多個 impl 塊