Rust - 結構體基本使用

語言: CN / TW / HK

theme: channing-cyan

這是我參與11月更文挑戰的第28天,活動詳情檢視:2021最後一次更文挑戰

基礎程式碼示例

為了理解何時需要使用結構體,官方文件給了一個案例,就是計算長方形的面積,這裡我們會一步一步的重構程式碼直到使用結構體為止。

計算長方形的面積的具體邏輯就是獲取長方形的寬度和高度,然後通過公式計算出長方形的面積,如下程式碼示例:

```rust fn main() { let width = 10; let height = 20; println!("長方形的面積是{}", area(width, height)) }

fn area(width: u32, height: u32) -> u32{ width * height } ```

通過cargo run執行程式後可以得到如下結果:

長方形的面積是200

雖然上述程式碼可以執行,並且在呼叫area函式時通過傳入長方形的長和寬可以計算出長方形的面積,但是寬度和高度是相關聯的,這個問題尤其體現在area函式的簽名上,雖然area可以計算長方形的面積,但是引數卻有兩個。這兩個引數本應相互關聯,但是程式本身並沒有體現出這一點,如果可以將長度和寬度組合在一起就可以更易懂也更易處理了。因此我們可以使用元組進行程式碼重構。

rust fn area(width: u32, height: u32) -> u32

使用元組重構程式碼

使用元組重構的程式碼示例如下:

```rust fn main() { let tup_w_h = (10, 20); // 索引0對應寬度

println!("長方形的面積是{}", area(tup_w_h))

}

fn area(tup_w_h: (u32, u32)) -> u32{ tup_w_h.0 * tup_w_h.1 } ```

元組版本的程式碼比基礎程式碼更好一些,幫助我們增加一些結構性,而且area只需要傳遞一個引數即可,但是這個版本的程式碼有一點不是非常明確:就是元組並沒有給出元素的名稱,只能通過索引獲取元組的每一部分,雖然在計算面積時將長寬弄混無關緊要但是如果在螢幕上繪製就會出現很大問題了,就必須搞清楚元組中哪個元素是長哪個是寬,這樣就很容易混淆而造成錯誤,原因就是沒有在程式碼中傳達資料所代表的意義。

使用結構體重構程式碼

現在我們就可以使用結構體為資料命名賦予意義,可以將元組轉換成一個有整體名稱而且每個部分也有對應名字的資料型別-結構體:

```rust struct WidthHeight { width: u32, height: u32, }

fn main() { let tup_w_h = WidthHeight {width: 10, height: 20}; // 索引0對應寬度

println!("長方形的面積是{}", area(&tup_w_h))

}

fn area(width_height: &WidthHeight) -> u32{ width_height.height * width_height.width } ```

上面的示例程式碼中定義了結構體WidthHeight,在在大括號中定義了欄位 widthheight,型別都是 u32。接著在 main 中,我們建立了一個具體的 WidthHeight 例項。

函式 area 現在被定義為接收一個名叫 width_height 的引數,其型別是一個結構體 WidthHeight 例項的不可變借用。前面的文章提到,我們希望借用結構體而不是獲取它的所有權,這樣 main 函式就可以保持 tup_w_h 的所有權並繼續使用它,所以這就是為什麼在函式簽名和呼叫的地方會有 &

area 函式訪問 WidthHeight 例項的 widthheight 欄位。area 的函式簽名現在明確的闡述了我們的意圖:使用 WidthHeightwidthheight 欄位,計算 WidthHeight 的面積。這表明寬高是相互聯絡的,併為這些值提供了描述性的名稱而不是使用元組的索引值 01 。結構體勝在更清晰明瞭。

結語

文章首發於微信公眾號程式媛小莊,同步於掘金

碼字不易,轉載請說明出處,走過路過的小夥伴們伸出可愛的小指頭點個贊再走吧(╹▽╹)