レッスン8 — Rust クイックリファレンス
問い
Reth / Revm / Alloy のコードを読むのに頻出する Rust 文法を 1 レッスンで一気に。網羅的でなく「これだけ知っていれば 80% 読める」最小セット。
原理(最小モデル)
- 変数.
let x = 5;(不変、デフォルト)/let mut y = 10;(可変)/const PI: f64 = 3.14;(コンパイル時定数)。 - 関数.
fn add(a: i32, b: i32) -> i32 { a + b }、最後の式が戻り値(;なし)、returnも使えるが慣用的でない。 - 所有権.
let s1 = String::from("hello"); let s2 = s1;で s1 ムーブ(使用不可)、&s1で借用、&mut s1で可変借用。 - Result / Option /
?.Result<T, E>(成功 / 失敗)+Option<T>(あり / なし)+?でエラー早期 return。 ifは式.let x = if cond { a } else { b };三項演算子なし、if自体が値を返す。match. パターンマッチ、全パターン網羅必須、_でデフォルト。- struct / enum.
struct Point { x: f64, y: f64 }/enum Color { Red, Green, Blue }、impl Point { fn new(...) -> Self { ... } }でメソッド。 - trait. 共有インターフェース、
impl Display for Point { ... }で実装、<T: Trait>でジェネリック境界。 - async / await.
async fn fetch() -> Result<...>、.awaitで完了待ち、Tokio ランタイム上。 - マクロ.
println!/vec!/format!/assert_eq!等、!付き、コンパイル時展開、関数より柔軟。
具体例 + ステップで組み立てる
Rustクイックリファレンス
これから書くコードに登場するRust構文を一気に押さえる。「Rustを学ぶ」専用コースは別にあるが、Reth/Revm/Alloyを学ぶ中でRustも自然に身につく よう、必要箇所で都度説明する。
1. 変数:let と let mut
Rustの変数はデフォルトで 不変(immutable) である。書き換えるときは mut を付ける。
let x = 10; // 不変
// x = 11; // コンパイルエラー!
let mut y = 10; // 可変
y = 11; // OK
2. 基本データ型
| 型 | 意味 |
|---|---|
i32, i64 | 符号付き整数 |
u32, u64, u128 | 符号なし整数 |
bool | true / false |
&str | 借用された文字列(読み取り専用、軽い) |
String | 所有された文字列(書き換え可能、ヒープ) |
「
&strとStringの違い」は最初に混乱しやすい。今は 「&strは他人の家を覗く感じ、Stringは自分の家を持つ感じ」 だけ覚えれば十分である。所有権は次のティアで詳しく扱う。
3. 関数
fn add(a: i64, b: i64) -> i64 {
a + b // 末尾にセミコロンを付けないと「式」として返り値になる
}
- 引数は
名前: 型 - 返り値は
-> 型 - 最後の式(セミコロンなし)が暗黙の return
4. メソッドの呼び方
Rustの値はメソッドを持つ。例:
let s = "0x123";
s.starts_with("0x"); // true / false
s.len(); // 5
"hello".to_uppercase(); // "HELLO"
5. 条件分岐:if / else
let n = 7;
if n % 2 == 0 {
println!("even");
} else {
println!("odd");
}
if 自体が「式」なので、値を返すこともできます:
let parity = if n % 2 == 0 { "even" } else { "odd" };
6. 表示:println!
! が付いているのは マクロ だからです(関数ではない)。{} がプレースホルダー。
let name = "Alloy";
println!("Hello, {}!", name); // Hello, Alloy!
println!("{} + {} = {}", 1, 2, 1 + 2); // 1 + 2 = 3
7. コレクション:Vec
可変長の配列である。スマートコントラクトのスタックやトランザクションリストなど、Rust EVMコードで頻出する。
let mut v: Vec<i64> = Vec::new();
v.push(10);
v.push(20);
let last = v.pop(); // Some(20)
println!("{:?}", v); // [10]
{:?} は デバッグ表示 用のプレースホルダーである。
8. これだけ覚えればOK
ここまでが Reth/Revm/Alloy の最初のコード読解に必要な「最小限の Rust」である。次の宿題でこれらをすべて使う。
| 構文 | 一言 |
|---|---|
let x = ... | 不変な変数 |
let mut x = ... | 可変な変数 |
fn name(arg: T) -> R {} | 関数定義 |
x.method() | メソッド呼び出し |
if .. else .. | 条件分岐(式としても使える) |
println!("{}", x) | 表示 |
Vec<T> | 可変長配列 |
完璧に覚える必要はない。書きながら少しずつ思い出す のが正解である。
まとめ(3行)
- 頻出文法 = 変数 / 関数 / 所有権 / Result /
?/if式 /match/ struct / enum / trait / async / マクロ。 - 「これだけ知っていれば 80% 読める」最小セット、網羅的でなく即実用、不明箇所は doc.rust-lang.org で都度確認。
- 次は最初の宿題「0x チェック」、Rust Playground で実際に書いてみる。