Rust一樣有Dereferencing的概念
let mut data = 42;
let ref = &mut data;
let derefCopy = *ref;
*ref = 13;
印出的data會是13, 而derefCopy是42
structure定義
相當單純, 定義後面不用加分號 (加了反而不能編譯)
變數預設為private, 要當成class來看待, 反正Rust剛好也沒有class關鍵字
可以把資料從舊的變數轉移到新的, 例如下面的another_car會得到"Squall", 0.5, 50000這些數值
並且把年份設定為1999, 由於轉移的規則, myCar.owner在another_car之後就會失效
再呼叫一次myCar.display_car_into(); 會無法編譯
如果要為某個struct實作函式, 需要用impl區塊來實作
有定義&self (相當於c++的this) 這個參數就表示函式是個member function
但如果沒有self, 那這個函式就是一個associated function (相當於c++ static function)
只能透過Struct::Function()來呼叫, 不能透過個別的instance來叫
列舉定義
列舉用起來很單純, 偏向C++的enum class, 我們可以在不同列舉定義同樣名稱, 而編譯器可以區分他們
不過使用時, 一定要把scope打全, 例如只能是WeekDay::Mon, 不能單純寫Mon
另外Rust的列舉強大到可以讓你實作函式! 有興趣的話可以去找範例
Option
可以搭配Result<Ok, Err>這個型別來進行成功/失敗時的動作:
例如這個例子, 成功的話會在Ok回傳整數, Err則是回傳錯誤字串, 挺有意思
fn calculate_square(num: i32) -> Result<i32, String> {
if num >= 0 {
let result = num * num;
println!("The square of {} is: {}", num, result);
Ok(result)
} else {
Err("Negative number provided".to_string())
}
}
fn main() {
let number = 7;
if let Err(e) = calculate_square(number) {
println!("Error: {e}");
}
}
程式碼的整理
這部分我看得蠻快的, 沒有著墨太多, 主要有package, crate, module三個概念
Packages - 最上層的架構, 可以包含許多Crates
至少要有一個crate, 最多一個library crate
cargo new package_name就可以產生
和直接跑crate不同, cargo run –bin package_name是必要的, 才知道要跑哪份package
Crates - 編譯的單元, 可以是binary或library, 包含許多Modules
Modules - 就平常那種模組概念
關係Package->Crate->Module
--------------------------------------------------------------------------------------------------
第一次看Rust就到這兒了~
說不定能順利初始化出視窗+D3D12, 讓自己對Rust更加熟練