【入門編】Hackの『Tuple』型と『List』型の使い分け:固定長データと可変長データの型安全な管理 – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

こんにちは!Hackの世界へようこそ。
HHVM(HipHop Virtual Machine)のコア開発に深く携わってきた立場から、今日は皆さんに、Hack言語の真髄とも言える「型安全なデータ管理」のコツをお話しします。

PHPから移行してきた方も、他の静的型付け言語から来た方も、HackのStrict Mode(厳格モード)に触れると、その徹底した型チェックに驚くかもしれません。中でも、日常的に使う「データの集まり」をどう表現するか——つまり、Tuple(タプル)とList(Hackでは主にvec)の使い分けは、堅牢なアプリケーションを構築する上での第一歩です。

「ここをクリアすれば、Hackの基本はバッチリマスターできますよ」。
それでは、魂を込めて解説していきましょう。

—

1. なぜ「使い分け」が重要なのか?

Hackの型チェッカー(`hh_client`)は、あなたのコードが実行される前に「その操作は安全か?」を冷徹なまでにチェックします。

  • Tuple: 「何番目に何が入っているか」が決まっている、固定長のデータ。
  • List (vec): 「同じ種類のものがいくつ並ぶか」が決まっていない、可変長のデータ。

この2つを混同すると、実行時に `Undefined index` でクラッシュしたり、型が合わずにバグを生んだりします。Hackでは、これらを明確に区別することで、「実行しなくてもバグがわかる」状態を作り出すのです。

—

2. Tuple(タプル):固定長の「特製ボックス」

タプルは、異なる型のデータをひとまとめにして持ち運びたいときに使います。
例えば、「ユーザーID(int)」と「ユーザー名(string)」をセットで返したい場合を考えてみましょう。

基本的な書き方

/

  • ユーザーの基本情報を返す関数
  • (int, string) というのがタプル型です

/
function get_user_info(): (int, string) {
$id = 42;
$name = “Hack_Master”;

// tuple() 関数で生成します
return tuple($id, $name);
}

function demo_tuple(): void {
// 分割代入(Destructuring)でスマートに受け取れます
list($id, $name) = get_user_info();

echo “ID: {$id}, Name: {$name}\n”;
}

ここが「極限の知見」:型チェッカーの視点

タプルの最大の特徴は、「添字(インデックス)ごとに型が固定されている」ことです。

  • `$info[0]` は絶対に `int`。
  • `$info[1]` は絶対に `string`。
  • もし `$info[2]` にアクセスしようとすれば、型チェッカーが即座にエラーを出します。

これは、実行時のメモリ管理においても非常に効率的です。HHVMは「このタプルは2要素しかない」とあらかじめ知っているため、境界チェックを最小限に抑えることができるのです。

—

3. List / vec(ベック):可変長の「コンベア」

一方で、同じ型のデータがいくつ並ぶか分からない場合は `vec`(Vectorの略)を使います。これが他の言語で言うところの「リスト」や「動的配列」に相当します。

基本的な書き方

/

  • 複数のユーザーIDのリストを受け取って処理する
  • vec は「intが入った可変長配列」という意味です

/
function process_ids(vec $ids): void {
foreach ($ids as $id) {
// $id は確実に int として扱えます
echo “Processing ID: {$id}\n”;
}
}

function demo_vec(): void {
$my_ids = vec[101, 102, 103]; // リテラルで記述
$my_ids[] = 104; // 要素の追加も自由自在

process_ids($my_ids);
}

注意すべきポイント

`vec` は Homogeneous(同質的) であるべきです。つまり、`vec[1, “hello”]` のようなコードは書けますが、型は `vec` になってしまい、Hackの恩恵を十分に受けられません。リストを使うときは「同じ型のものの集まり」であることを意識しましょう。

—

4. どっちを使う? 判別のフローチャート

どちらを使うべきか迷ったら、この基準で選んでみてください。

| 特徴 | Tuple (タプル) | vec (リスト) |
| :— | :— | :— |
| 長さ | 固定(変えられない) | 可変(増やしたり減らしたりできる) |
| 型 | 要素ごとに異なる型を持てる | すべて同じ型(推奨) |
| 用途 | 関数の多値返却、座標(x, y)など | 検索結果、ログ一覧、ループ処理など |
| イメージ | 仕切りのあるお弁当箱 | 同じ皿が並ぶ回転寿司 |

—

5. よくある罠:型エラーを回避するコツ

罠1:タプルの要素に動的にアクセスしようとする

$t = tuple(1, “st”);
$i = 0;
// $val = $t[$i]; // エラー! 型チェッカーは $i が 0 か 1 か確信が持てません

タプルは「何番目に何があるか」が静的に決まっている必要があります。動的な添字を使いたい場合は `vec` か `dict` を検討してください。

罠2:vec をタプルのように扱おうとする

function take_tuple((int, int) $pair): void {}

$v = vec[1, 2];
// take_tuple($v); // エラー! vec は (int, int) ではありません

たとえ要素数が2つであっても、`vec` は「将来的に3つになるかもしれない」という性質を持つため、厳格なタプルとしては受理されません。

—

結び:Hackを掌握するために

Hackの型システムは、単なる制約ではなく、「コードの意図を明確にするための言語」です。

  • 「このデータは構造が決まっているんだ」と思えば Tuple を。
  • 「このデータは並びであり、数は変わるんだ」と思えば vec を。

これを意識するだけで、あなたの書くHackコードの堅牢性は劇的に向上します。HHVMのJITコンパイラも、あなたの明確な型指定を見て「よし、最適化しやすいぞ!」と喜んで高速に動作してくれるでしょう。

一歩ずつ、この厳格な世界を楽しんでください。型チェッカーと仲良くなれば、深夜のデバッグ作業とはおさらばできますよ。

次は、さらに高度な `shape`(型付き連想配列)の世界でお会いしましょう。ハッピーハッキング!

タイトルとURLをコピーしました