初學 rust 筆記

(Alternative title: what I wish I knew when I learned Rust)

開始寫 rust 半年了,簡單記錄一下初學時沒注意到的好東西。

Language Server

一開始寫 rust 的時候馬上就去找了 lsp server 來用,但是那時候看 langserver.org 以為 rls 是首選,用了好一陣子才發現到 rust-analyzer 是取代 rls 的更加選擇:尤其是多了 code-actionclippy 的支援,寫起來方便了不少。

Rust edition

剛學 rust 的時候是以寫 parser 為出發點,那時不知道 rust 有區分 edition,而查到的文章在引用外部 crate 時都會加上 extern crate SOME_CRATE,但是這在 2018 edition 已經是用不到的了。

Option/Result & ? operator

可能是剛開始在讀 rust book 時似乎讀太急,沒有注意到 ? operator 這個好用的東西,反而還花了好多時間看 rust 有沒有 do notation 的替代品… 不過我還是很想念 monad 與他的好夥伴 do notation,希望之後 GAT 出來有緣用到

Const Generics MVP

在寫 array 相關的 generic function 時,能在 type 上描述 array 的大小,十分方便。這使得我不用改用 &[T] 或是寫死成常數長度,可以在 compile-time 任意決定我需要的大小。

struct Array<T, const N: usize> { arr: [T; N] }

Associated Types: Add<Output=T>

剛開始不知道有 associated type 可以指定,每次用完 Add 之類的 traits 都還寫死 From/Into 來轉型

iterator’s type

在 rust 裡面,iterator 的 type 不像其他語言 我的其他語言是指 Python, Haskell一樣只表達每個元素的型別(Iterator<T>),而是將整個運算個過程層層包在 type 裡的 (Filter<Map<Iter<...>, ...>, ...>),這使得下面這樣的程式不會 type check:

let xs = match filter_flag {
    true  => xs.iter().filter(|x| x % 2 == 0),
    false => xs.iter()
};
// do something over xs