接下來我們要來看看模組
在 Ruby 的程式中, Module 的概念跟 Trait 比較接近,擴充模組的意思,如果今天我想要會魔法,我可以安裝魔法 Module 來擴充,並且使用裡面的方法
不過 Rust 就不一樣了, Rust 的 Module 用於
將文件分門別類,避免整個散在根目錄中
以及把
大包的程式碼拆分成 Package 以及 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
|
在 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" }