やあ。Hackの世界へようこそ。HHVMの深淵から戻ってきたばかりの私だ。
PHPの「なんでも入る配列(`array`)」という名のカオスから脱却し、Hackの厳格な型システムへ足を踏み入れた君を歓迎するよ。今日は、Hackを使いこなす上で避けては通れない、そして極めて強力な武器である「Tuple(タプル)」について語ろう。
君がこれまで書いてきたPHPコードのあちこちに潜む「戻り値の配列」。あれを型安全なTupleへ書き換えることは、単なるリファクタリングじゃない。君のコードに「契約(Contract)」を刻み込む作業なんだ。
—
1. なぜ「配列」を捨てるのか?
PHPで複数の値を返すとき、こんなコードを書いたことはないかな?
// PHPの古いスタイル
function getUserStatus(): array {
return [‘active’, 100]; // 0番目はステータス、1番目はスコア?覚えられない!
}
このコードの何が問題か、君ならもう分かっているはずだ。
1. 意味不明: インデックス `0` が何を指すか、ドキュメントを見ないと誰にも分からない。
2. 脆弱: 誰かが誤って `[‘active’]` とだけ返しても、実行時まで誰も怒ってくれない。
3. コスト: HHVMのJITコンパイラにとって、動的な配列はメモリの無駄遣い。最適化の妨げになるんだ。
2. Tuple:位置で語る、軽量な構造体
Tupleは、決まった個数の要素を「特定の順序で」保持する型だ。`shape`も強力だが、名前(キー)すら不要なほど密接な関係にあるデータなら、Tupleの方が圧倒的に軽量で高速だ。
基本的な書き方
// HackのTupleスタイル
function getUserStatus(): (string, int) {
return tuple(‘active’, 100);
}
// 受け取り側
$status = getUserStatus();
// $status[0] は string, $status[1] は int であることがコンパイル時に確定する
どうだい? 戻り値の型シグネチャに `(string, int)` と書くだけで、HHVMは「この関数は必ずこの順番でこの型の値を返す」と確信できる。型チェッカーが、君の背後で常に監視しているようなものだ。
—
3. 現場で役立つ「分解(Destructuring)」の魔法
Tupleの真骨頂は、受け取った瞬間にバラせることにある。
// 分解代入でコードが劇的にすっきりする
list($status, $score) = getUserStatus();
// もっとモダンな書き方(HHVMの進化を感じよう)
[$status, $score] = getUserStatus();
echo “User is {$status} with score {$score}”;
この記法を使えば、`$status[0]` という「魔法の数字」をコード内に散らさなくて済む。可読性が上がり、バグが入り込む余地が消滅するんだ。
—
4. ここで躓くな!よくあるエラーと教訓
Hackの初心者が必ず一度は踏む地雷がある。ここをクリアすれば、君はもう中級者だ。
地雷①:インデックス範囲外アクセス
$result = tuple(‘a’, 1);
echo $result[2]; // コンパイルエラー!
Tupleは固定長だ。`2`番目の要素なんて存在しない。PHPなら `null` が返ってきて後で致命的なエラーになるが、Hackはコンパイルの時点で君の手を止めてくれる。感謝すべきことだと思わないか?
地雷②:型の不一致
function get(): (string, int) {
return tuple(100, ‘active’); // コンパイルエラー!
}
順序を間違えたら、即座に「型が合いません」と怒られる。これは単なる制約じゃない。君のロジックが論理的に正しいことを証明するプロセスなんだ。
—
5. まとめ:Hackの重みを理解する
PHPの配列が「何でも入る箱」だとしたら、HackのTupleは「精密な機械の部品」だ。
- 軽量性: HHVMのメモリ管理において、Tupleはスタックに近い領域で効率的に扱われる。
- 安全性: 型チェッカーが「位置」というルールを強制してくれる。
- 保守性: 戻り値を変更したとき、影響を受ける箇所がすべてコンパイルエラーとして可視化される。
最初は「少し窮屈だな」と感じるかもしれない。だが、その窮屈さは君が書いたコードを守るための「防壁」なんだ。
さあ、エディタを開いて、プロジェクト内の `array` を一つ、Tupleに書き換えてごらん。その瞬間から、君のコードは「動くもの」から「信頼できるもの」へと進化するはずだ。
また何か詰まったら聞きに来なさい。HHVMの深淵から、いつでも導いてやるよ。