iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

接下來我們要來看看模組

在 Ruby 的程式中, Module 的概念跟 Trait 比較接近,擴充模組的意思,如果今天我想要會魔法,我可以安裝魔法 Module 來擴充,並且使用裡面的方法

不過 Rust 就不一樣了, Rust 的 Module 用於

將文件分門別類,避免整個散在根目錄中

以及把

大包的程式碼拆分成 Package 以及 Module

Module 怎麼運用

要創建 Module ,我們需要使用 mod 加上模組名稱

mod product {
    struct sugar {
        name: String,
    }
}

模組裡面可以放函式、結構、枚舉等,也可以再包一層 mod

呼叫方式有點像 Ruby 的 namespace Product::Sugar

fn main() {
    mod product {
        struct sugar {
            name: String,
        }
    }

    let mint = product::sugar {
        name: "coffee mint".to_string(),
    };
}

編譯時會噴錯,為什麼呢?

仔細看一下錯誤訊息,他要告訴我們 sugar 已經被定義,且是 private 結構

> cargo run

error[E0603]: struct `sugar` is private
 --> src/main.rs:8:25
  |
8 |     let mint = product::sugar {
  |                         ^^^^^ private struct
  |

Module 也有分私有與公有

在 Rust 的 Module 中,有分成 private 與 public

如果是 private ,就僅限於 Module 做使用, public 就不受限了

我們就將結構變成 public 吧

fn main() {
    mod product {
        pub struct sugar {
            name: String,
        }
    }

    let mint = product::sugar {
        name: "coffee mint".to_string(),
    };
}

這樣總行了吧?再跑一次

又錯了,這次的錯誤訊息指出, sugar 裡面的 name 是 private

> cargo run

error[E0451]: field `name` of struct `sugar` is private
 --> src/main.rs:9:9
  |
9 |         name: "coffee mint".to_string(),
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ private field

剛剛我們只是將結構變成 public ,不過結構內容並沒有變成 public ,

所以使用的時候就會錯誤,我們只要再將內容變成 public 就可以了

(順便把它印出來)

fn main() {
    mod product {
        pub struct sugar {
            pub name: String,
        }
    }

    let mint = product::sugar {
        name: "coffee mint".to_string(),
    };

    println!("{:?}", mint)
}

還是出現錯誤訊息了,不過這次跟 module 無關,

在命名上, Rust 的結構是使用駝峰是命名法,所以會希望 Module 裡面以大寫字母為開頭

另外我們要將 mint 印出,需要用到 Debug 這個 derive

> cargo run

warning: type `sugar` should have an upper camel case name
 --> src/main.rs:3:20
  |
3 |         pub struct sugar {
  |                    ^^^^^ help: convert the identifier to upper camel case (notice the capitalization): `Sugar`
  |
  = note: `#[warn(non_camel_case_types)]` on by default

error[E0277]: `sugar` doesn't implement `Debug`
  --> src/main.rs:12:22
   |
12 |     println!("{:?}", mint)
   |                      ^^^^ `sugar` cannot be formatted using `{:?}`
   |
   = help: the trait `Debug` is not implemented for `sugar`
   = note: add `#[derive(Debug)]` to `sugar` or manually `impl Debug for sugar`
   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)

改完後

fn main() {
    mod product {
        #[derive(Debug)]
        pub struct Sugar {
            pub name: String,
        }
    }

    let mint = product::Sugar {
        name: "coffee mint".to_string(),
    };

    println!("{:?}", mint)
}

終於成功印出來了

> cargo run

Sugar { name: "coffee mint" }

上一篇
Day 22 - 生命週期 part 4
下一篇
Day 24 - Module part 2
系列文
成為程式界的 F1 賽車手,用 30 天認識 Rust 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言