Menu
Coddy logo textTech

Rust チートシート

最終更新

Hello World と構造

Rust プログラムは fn main から始まり、文はセミコロンで終わります。

操作構文
エントリポイントfn main() { ... }
1 行を出力println!("Hello, World!");
値を入れて出力println!("{} is {}", name, age);
デバッグ形式で出力println!("{:?}", value);
行コメント// comment
モジュールから項目を使うuse std::collections::HashMap;
ビルドして実行cargo run
リリースバイナリをビルドcargo build --release

変数と型 (let / mut)

束縛は既定で不変です。再代入を許すには mut を付けます。

操作構文
不変の束縛let x = 5;
可変の束縛let mut count = 0;
明示的な型let age: u32 = 30;
定数const MAX: u32 = 100;
シャドーイングlet x = x + 1;
整数型i32, u32, i64, usize
その他のスカラーf64, bool, char
タプルlet pair: (i32, &str) = (1, "a");
型変換let f = x as f64;

制御フロー

if は式で、Rust にはループの形が 3 種類あります。

操作構文
if / elseif x > 0 { ... } else { ... }
式としての iflet y = if x > 0 { 1 } else { -1 };
無限ループloop { ... }
値を返すループlet v = loop { break 5; };
while ループwhile x < 100 { ... }
範囲を forfor i in 0..10 { ... }
コレクションを forfor item in &items { ... }
break / continuebreak;, continue;

関数

最後の式 (セミコロンなし) が戻り値になります。

操作構文
基本的な関数fn add(a: i32, b: i32) -> i32 { a + b }
明示的な returnfn f() -> i32 { return 5; }
戻り値なしfn log(msg: &str) { ... }
参照を取るfn len(s: &String) -> usize { s.len() }
クロージャlet add = |a, b| a + b;
型付きクロージャlet sq = |x: i32| -> i32 { x * x };
引数としての関数fn apply(f: impl Fn(i32) -> i32) { ... }

所有権と借用

各値には所有者が 1 つあり、参照は所有権を取らずに値を借用します。

操作構文
ムーブ (所有権が移る)let b = a; (a はもう有効でない)
クローン (ディープコピー)let b = a.clone();
不変の借用let r = &x;
可変の借用let r = &mut x;
関数内での借用fn read(s: &String) { ... }
間接参照*r
借用のルール同時に複数の &、または 1 つの &mut。両方は不可
スライス (範囲を借用)let part = &arr[1..3];

構造体と列挙型

構造体は関連するデータをまとめ、列挙型は複数のバリアントのいずれかである値を表します。

操作構文
構造体を定義struct Point { x: i32, y: i32 }
インスタンスを生成let p = Point { x: 1, y: 2 };
フィールドにアクセスp.x
タプル構造体struct Pair(i32, i32);
メソッド (impl ブロック)impl Point { fn dist(&self) -> f64 { ... } }
関連関数impl Point { fn new() -> Self { ... } }
列挙型を定義enum Shape { Circle(f64), Rect(f64, f64) }
名前付きフィールドの列挙型enum Msg { Move { x: i32, y: i32 } }
トレイトを derive#[derive(Debug, Clone)]

パターンマッチング (match)

match は値をパターンと照合し、網羅的でなければなりません。

操作構文
値でマッチmatch x { 1 => "one", _ => "other" }
列挙型でマッチmatch shape { Shape::Circle(r) => ... }
範囲でマッチmatch n { 1..=5 => ..., _ => ... }
ガード付きで束縛match x { n if n > 0 => ... }
タプルでマッチmatch point { (0, y) => ..., (x, _) => ... }
if let (単一パターン)if let Some(v) = opt { ... }
while letwhile let Some(v) = stack.pop() { ... }
構造体を分解let Point { x, y } = p;

トレイトとジェネリクス

トレイトは共有された振る舞いを定義し、ジェネリクスはコードを多くの型で動くようにします。

操作構文
トレイトを定義trait Area { fn area(&self) -> f64; }
トレイトを実装impl Area for Circle { fn area(&self) -> f64 { ... } }
デフォルトメソッドtrait Greet { fn hi(&self) { ... } }
ジェネリック関数fn largest<T: PartialOrd>(list: &[T]) -> &T { ... }
ジェネリック構造体struct Wrapper<T> { value: T }
トレイト境界 (where)fn f<T>(x: T) where T: Display { ... }
impl Trait 引数fn print(item: impl Display) { ... }
トレイトオブジェクトlet shapes: Vec<Box<dyn Area>> = ...;

エラー処理 (Result / Option)

Rust は値の不在を Option で、回復可能なエラーを Result で表します。

操作構文
オプショナルな値Option<T>: Some(v) または None
Result 型Result<T, E>: Ok(v) または Err(e)
Result を返すfn read() -> Result<String, Error> { ... }
? で伝播let data = read()?;
unwrap (None/Err で panic)opt.unwrap()
デフォルト値opt.unwrap_or(0)
値を mapopt.map(|v| v + 1)
両方のアームを処理match res { Ok(v) => ..., Err(e) => ... }
Option を Result に変換opt.ok_or("missing")?

よく使うコレクション (Vec / HashMap)

Vec は拡張可能な配列で、HashMap はキーと値のストアです。

操作構文
ベクタを作成let mut v: Vec<i32> = Vec::new();
ベクタリテラルlet v = vec![1, 2, 3];
push / popv.push(4);, v.pop();
インデックスアクセスv[0]
安全なアクセスv.get(0)Option<&T> を返す
反復for x in &v { ... }
長さv.len()
マップを作成let mut m: HashMap<String, i32> = HashMap::new();
挿入 / 取得m.insert(k, v);, m.get(&k)
Entry API*m.entry(k).or_insert(0) += 1;

最もよく使う Rust の構文を 1 ページにまとめました。この Rust チートシートは、言語の中核のクイックリファレンスです。変数と可変性、所有権と借用、構造体と列挙型、パターンマッチング、トレイトとジェネリクス、そして Rust のエラー処理を支える ResultOption 型を収録しています。

ここに載っているものはすべて標準の Rust で、最近の安定版ツールチェーンでコンパイルできます。必要なものをコピーするか、Rust プレイグラウンドですべてのスニペットをその場で試してみてください。cargo のインストールは不要です。

Rust チートシート よくある質問

この Rust チートシートは無料ですか?
はい。この Rust チートシートは完全に無料で、登録も不要です。ブックマークしておけば、match のパターンやトレイト境界、コレクションのメソッドを調べたいときにいつでも戻ってこられます。
Rust の所有権と借用とは何ですか?
所有権は Rust のメモリモデルです。すべての値にはちょうど 1 つの所有者があり、その所有者がスコープを抜けると値は解放されます。借用を使うと、参照を使って所有権を取らずに値にアクセスできます。不変の借用には &x、可変の借用には &mut x を使います。コンパイラは 1 つのルールを強制します。同時に複数の不変借用、またはちょうど 1 つの可変借用を持てます。これによりコンパイル時にデータ競合を防ぎます。
Rust の Result と Option の違いは何ですか?
Option<T> は値が不在かもしれないことを表し、Some(v)None のいずれかです。報告すべきエラーはなく、ただ値が欠けているだけのときに使います。Result<T, E> は失敗し得る操作を表し、Ok(v)Err(e) のいずれかで、何かうまくいかなかったときにエラー値を運びます。「あるかもしれない」には Option、「これは失敗し得る」には Result を使いましょう。? 演算子はどちらも伝播します。
Rust をオンラインで練習できますか?
はい。Rust プレイグラウンドを開けば、このチートシートのどのスニペットも、ブラウザ上でコンパイルして実行できます。cargo やツールチェーンのインストールは不要です。体系的に学びたいときは、Coddy の無料インタラクティブ Rust コースが、変数と所有権からトレイト、エラー処理まで段階的に導いてくれます。
このチートシートは初心者に向いていますか?
はい。最もよく使うトピック (変数、制御フロー、関数) から高度なもの (トレイト、ジェネリクス、エラー処理) へと並べてあるので、初日から上のセクションを使い、所有権やその他には慣れながら進めます。
Coddy programming languages illustration

CoddyでRustを学ぼう

始める