這章教大家怎用使用一些常用的 heap object
使用 get method 無論如何都可以拿到一個型別為 Option<&T>
的物件,而直接對 vector 取 reference 的話則可能產生 panic
若是在獲得 immutable reference 後,對物件以 mutable reference 做操作則會在編譯時報錯
有關 vector 的 pitfall 和其它用法可以參考這篇跟這篇
我們可以用 String::from()
將一個 str
slice 轉為 String
物件
有很多種方法可以協助使用者修改字串
若是要串接很多字串可能會這樣寫,看起來有夠醜
幸好有個很棒的 macro 可以用
字串在 Rust 中分成兩種: String 和 str,其中後者只能(?)以 reference 方式存取,兩者的差別簡單來說就是前者是可以被動態修改而後者不行,在官方文件中有詳細的說明可以參考
此外 Rust 中的 String/&str 物件 (以下通稱字串) 皆是以 UTF-8 儲存,也因此在一些存取方式上需要多加注意,例如說下方這段程式碼是沒辦法 compile 的
因為 Rust 希望所有 indexing 操作都是在常數時間內完成,但 UTF-8 的單個字元不一定只佔一個位元寬度,所以在設計上就不允許以 index 直接取值,而是要改成
或是簡潔一點
由於 hashmap 並沒有被包含在 prelude 中,我們必須要手動將它引入
注意到建立 hashmap 時所有權的轉移是根據型別是否有實作 Copy trait 來決定的,以 i32 為例因為有實作 Copy 則會直接複製一份到 hashmap 中
我們可以透過 insert
直接修改對應的值
或是以 entry
加上 or_insert
method 判斷初值是否存在,再 insert
搞定錯誤處理是寫程式必經的一段痛苦旅程,幸運的是 Rust 在語言層面上提供了方便的語法及功能讓開發者可以較為輕鬆的完成這件事
看到 hello world 跟著錯誤訊息彈出來感覺如何呢?
如果想要得知完整的 stack trace 可以在執行 cargo run
加上 RUST_BACKTRACE=1
Result 是個用來協助錯誤處理而生的 enum,定義如下
這邊以開檔為例,我們可以對 return value 做 pattern matching
上面這個例子可能沒有辦法分辨是權限不足,還是檔案不存在,所以我們可以再對 Result 做一次 pattern matching
不過上面這個例子似乎是用到太多 match 了,可以再精簡一點,用 unwrap_or_else
搭配 lambda function 來寫
當然,如果你是個慵懶的開發者,啥錯誤都不想要處理的話,也可以直接
或是想讓 debug 容易一點的話
章節一開始提到的語法就是指 "?" symbol,開發者可以利用他方便的將錯誤作為 return 值回傳