Rust コーディングガイドライン(主要ルール50項目)
命名(Rust 固有)
| ルール | ガイドライン |
|---|
get_ 接頭辞を付けない | fn get_name() ではなく fn name() |
| イテレーターの慣例 | iter() / iter_mut() / into_iter() |
| 変換の命名 | as_(低コストの借用)、to_(高コスト)、into_(所有権) |
| 静的変数の接頭辞 | static には G_CONFIG、const には接頭辞なし |
データ型
| ルール | ガイドライン |
|---|
| newtype を使う | ドメインの意味を表す struct Email(String) |
| スライスパターンを優先する | if let [first, .., last] = slice |
| 事前に確保する | Vec::with_capacity()、String::with_capacity() |
| Vec の乱用を避ける | サイズが固定の場合は配列を使う |
文字列
| ルール | ガイドライン |
|---|
| バイト列を優先する | ASCII の場合は s.chars() より s.bytes() |
Cow<str> を使う | 借用したデータを変更する可能性がある場合 |
format! を使う | + による文字列連結よりも使用する |
| 入れ子の反復を避ける | 文字列に対する contains() は O(n*m) |
エラー処理
| ルール | ガイドライン |
|---|
? で伝播する | try!() マクロは使わない |
unwrap() より expect() | 値が保証されている場合 |
| 不変条件にはアサーションを使う | 関数の開始時に assert! |
メモリ
| ルール | ガイドライン |
|---|
| 意味のあるライフタイム名 | 'a だけでなく 'src、'ctx |
RefCell には try_borrow() を使う | パニックを避ける |
| 変換にはシャドーイングを使う | let x = x.parse()? |
並行処理
| ルール | ガイドライン |
|---|
| ロックの順序を特定する | デッドロックを防ぐ |
| プリミティブ型にはアトミックを使う | bool/usize に Mutex を使わない |
| メモリオーダーを慎重に選ぶ | Relaxed/Acquire/Release/SeqCst |
非同期処理
| ルール | ガイドライン |
|---|
| CPU 負荷の高い処理には同期処理を使う | Async は I/O 用 |
| await をまたいでロックを保持しない | スコープ付きガードを使う |
マクロ
| ルール | ガイドライン |
|---|
| 必要な場合以外は避ける | 関数やジェネリクスを優先する |
| Rust の構文に従う | マクロの入力は Rust のコードのように見える形にする |
非推奨 → より良い代替
| 非推奨 | より良い代替 | 以降 |
|---|
lazy_static! | std::sync::OnceLock | 1.70 |
once_cell::Lazy | std::sync::LazyLock | 1.80 |
std::sync::mpsc | crossbeam::channel | - |
std::sync::Mutex | parking_lot::Mutex | - |
failure/error-chain | thiserror/anyhow | - |
try!() | ? 演算子 | 2018 |
クイックリファレンス
Naming: snake_case (fn/var), CamelCase (type), SCREAMING_CASE (const)
Format: rustfmt (just use it)
Docs: /// for public items, //! for module docs
Lint: #![warn(clippy::all)]
Claude は Rust の慣例をよく理解しています。これらは、ひと目では分かりにくい Rust 固有のルールです。