こんにちは。HHVMの深淵を覗き込み、Hackの型システムと共に生きる者として、今日は皆さんに「Hackがなぜこれほどまでに堅牢なのか」という秘密の一端を共有しようと思います。
Hackを触り始めた皆さんが、まず最初に「おや?」と思うのが、配列(`array`や`vec`)の緩やかさと、`tuple`型の持つ厳格さのコントラストではないでしょうか。今日は、この`tuple`を使いこなし、あなたのコードから「存在しないインデックスへのアクセス」という悪夢を根絶する方法を伝授します。
—
なぜ「配列」ではなく「tuple」なのか?
多くの開発者は、複数の値を返すときに、つい`vec
一方、`tuple`は「中身が決まった、開けられない宝箱」です。
tupleの真髄:コンパイル時の契約
`tuple`は、要素数と各要素の型が定義された瞬間に固定されます。HHVMの型チェッカー(`hh_client`)は、あなたがこの契約を破ろうとすると、実行を待たずに即座に警告を発します。「そんなインデックスは存在しない」「期待している型と違う」と。
これが、我々がHackを愛してやまない理由です。実行時のエラーを、コードを書いている瞬間に消し去ることができるからです。
—
基本の使い方:安全な多値返却
まずは、ユーザー情報を取得する関数を例に見てみましょう。
<<__EntryPoint>>
function main(): void {
// tupleを使って、名前(string)と年齢(int)を同時に返す
list($name, $age) = getUserData(1);
echo “名前: $name, 年齢: $age”;
}
// tupleの型定義は (T1, T2, …) と書きます
function getUserData(int $id): (string, int) {
// 擬似的なDB取得
return tuple(“Alice”, 25);
}
このコードの「ここがすごい」
1. 型の明示: `(string, int)` と書くことで、呼び出し元は「必ず文字列と整数がこの順序で返ってくる」という保証を得られます。
2. `list()` による分解: `list(…)` を使うことで、中身を明示的に変数へ割り当てられます。もし将来的に戻り値が増えたら、型定義が合わなくなり、コンパイルエラーとして即座に検知できます。
—
陥りやすい罠と「型チェッカー」の眼差し
初心者がよくやってしまうのが、`tuple`を配列のように扱おうとすることです。
function getPoints(): (int, int) {
return tuple(10, 20);
}
// ❌ 悪い例:インデックスでアクセスしようとする
$result = getPoints();
$x = $result[0]; // これは動きますが、tupleの良さを消しています
$y = $result[2]; // ⚠️ 致命的:コンパイル時にHHVMが「そんなインデックスはない」と指摘します
先輩からのアドバイス
`tuple`は「リスト」ではなく「構造体に近いもの」と考えてください。インデックスでアクセスするのではなく、必ず `list($x, $y) = …` のように分解して、中身に名前を付けてあげるのが、読みやすく安全なHack流のコードです。
—
さらに深く:型エイリアスで可読性を最大化
`tuple`を何度も書くと、コードが少し読みづらくなりますよね。そんなときは`type`エイリアスを使いましょう。
// 型に名前を付けることで、コードの意味が劇的に向上します
type UserInfo = (string, int);
function processUser(): UserInfo {
return tuple(“Bob”, 30);
}
こうすることで、「この関数は何を返すのか?」という問いに対して、型定義が一瞬で答えてくれるようになります。
—
まとめ:ここをクリアすれば、あなたはもう中級者
`tuple`を使いこなすということは、「データに厳格な構造を持たせる」という習慣を身につけることです。
- 配列(vec/dict): データの集合を扱うとき。
- tuple: 関数から戻り値として、固定された複数の値を返すとき。
この使い分けができるようになれば、あなたの書くHackコードは、他の言語から来た開発者が驚くほど堅牢で美しいものになるはずです。
もしコンパイルエラーが出ても、それはHHVMがあなたをバグから守ってくれている証拠です。そのエラーメッセージを「敵」ではなく「道しるべ」として受け取ってください。そこをクリアした先には、より大きな設計の自由が待っていますよ。
さあ、次はどんな複雑なデータ構造を、`tuple`で美しく型付けしてみますか?