Rust ガイドライン
Rust ライブラリの設計者向けに,API のデザイン上の推奨事項がまとめられています
(Rust APIガイドライン).ガイドラインには,命名規則,相互運用性,ドキュメンテーション,信頼性などの項目が挙げられています.
ガイドラインのいくつかの項目を関連するツールとともに紹介します.
Rust スタイルガイド
Rust にはコーディングスタイルのガイドラインを示す Rust
Style Guide が用意されている.
また,Rust Style Guide に沿ってコードを自動的に整形してくれるツール rustfmt も提供されている.
Rust のスタイル例を示す.
- インデント,改行
- タブではなく,空白を用いる.
- 各インデントは 4 つの空白を用いる.
- 1 行の最大文字数は 100 文字とする.
- コメント
- 一行コメント: //
- 複数行コメント: /* ~ */
- ドキュメンテーション(Doc)コメント: ///, //! (各行の先頭に記述)
/// は後に続く要素に対してのコメント,//! は このソースファイル全体のコメント.
Markdown 記法で記述,rustdoc により HTML に変換される.
- 命名規則
- snake_case
クレート,モジュール,関数,メソッド,ローカル変数
- CamelCase
型,トレイト,Enumのバリアント
- SCREAMING_SNAKE_CASE
スタティック変数,定数
Clippy (ソースコード静的解析ツール)
Rust 言語のソースコードに対し,コンパイラよりも詳細かつ厳密なチェックを行うツールであり,バグの原因になるような曖昧な記述も警告される (
ALL the Clpiiy Lints).
Clippy で指摘される警告の分類と例を示す.
- Correctness
正しい結果にならない可能性有
- almost_swapped
foo = bar; bar = foo のような処理,swap のつもりの失敗?
- bad_bit_mask
x & 2 == 3 のような処理 (常に false)
- clone_double_ref
&&T に対する .clone() 処理 (T ではなく &T のクローン)
- suspicious_arithmetic_impl
算術演算の実装における疑わしい処理(Add の実装に減算処理がある等)
- Restriction
禁止されるべき処理
- float_cmp_const
浮動小数点数を定数と直接比較しない (誤差を考慮).
- integer_arithmetic
オーバフローが発生する可能性がある整数演算
- modulo_arithmetic
負の数が含まれる剰余演算 (%) の結果は,言語により異なる可能性がある.
(Rust: 17 % -3 = 2, Python: 17 % -3 = -1)
- else_if_without_else
最終的な else のない else if 分岐
- Complexity
コードをなるべく簡潔に
- bool_comparison
bool 値 x に対して x == true などと書かない.
- double_comparisons
二重の比較は,単一の比較式にする.
- large_const_arrays
大きな const 配列は,static として宣言すべきである (const はインライン展開).
- manual_swap
変数値の入れ替えには,std::mem::swap 関数を利用する.
- Perf
性能的に好ましくない処理
- box_vec
Box<Vec<_>> を使わない (Vec は最初からヒープ領域に確保される).
- manual_memcpy
スライス間で項目をループを使ってコピーしない (copy_from_slice / clone_from_slice を使う).
- slow_vector_initialization
ベクトルの 0 での初期化は,with_capacity(len)で領域を確保した後,0 で初期化するのではなく,vec![0; len] を使う.
- useless_vec
&[..] が使える場面で &vec![..] を使わない.
- Style
Rust 言語の推奨されるスタイル
- needless_return
ブロックの最後の return 文は不要である (式のみ).
- many_single_char_names
単一文字の変数名が多い(変数の内容が想定される名称が好ましい).
- assign_op_pattern
a = a + b ではなく,a += b のように書く.
- comparison_chain
if 文で比較の分岐を繰り返すのではなく,match と cmp を使う.