Menu
Coddy logo textTech

形状 vs 柔軟なテーブル

CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 40/73。

これで、レコードテーブルを扱う方法が2つになりました。Luaで従来から使われていた loose な方法と、declared shapes(宣言されたシェイプ)です。それぞれにどのようなメリットがあるか整理しておきましょう。

loose なテーブルは何でも受け入れます。しかし、その柔軟性には代償があります。フィールド名を打ち間違えると(user.nmae)、エラーにならず silently(静かに)nil になります。フィールドを忘れれば、その穴に最初に触れるコードの実行時に、遠く離れた場所でバグが表面化します。

local user = {name = "Ana", age = 20}
print(user.nmae) -- loose table: silently prints nil

シェイプを宣言すれば、そうしたミスを実行時から編集時へと前倒しできます。コードを書いた瞬間にチェッカーがタイポを指摘し、エディタはフィールド名を補完できるようになり、type 宣言はテーブルに何が含まれているかのドキュメントとしても機能します。

type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ type error: key 'nmae' not found in User

TypeScript から来た方のために補足すると、Luau には interface キーワードがありません。type がすべてのシェイプを処理します。また、「宣言の結合(declaration merging)」もありません。同じスコープ内で同じ名前の型を2つ宣言すると error になるため、各シェイプの定義は常に1つだけになります。

Luau のシェイプは構造的(structural)です。適切な型の適切なフィールドを持つテーブルであれば、どこでどのように作成されたかに関わらず一致します。そして、loose なテーブルにも使いどころはあります。簡単なスクリプトや真に動的なデータには宣言されたシェイプは不要です。ただし、関数間で受け渡されるものについては、シェイプを使うことで修正コストが低いうちにミスを検出できます。

自分で試してみよう

このレッスンにはコードチャレンジは含まれていません。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Luau入門のすべてのレッスン