形状 vs 柔軟なテーブル
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 42/80。
レコードテーブルを扱う方法が2つになりました。これまでLuaで使ってきた緩い方法と、宣言された形です。それぞれの利点を確認してみましょう。
緩いテーブルには何でも入れられます。その柔軟性には代償があります。フィールド名を間違えると(user.nmae)、何も知らせずにnilが返されます。フィールドを入れ忘れると、実行時にその穴に最初に触れるコードの中で、ずっと後になってバグが表面化します。
local user = {name = "Ana", age = 20}
print(user.nmae) -- 柔軟なテーブル: エラーを出さずにnilを表示する形を宣言すれば、こうした間違いを実行時ではなく編集時に見つけられます。入力した瞬間にチェッカーがタイプミスを指摘し、エディターでフィールド名を自動補完できるうえ、type宣言はテーブルに何が含まれるかを示すドキュメントにもなります。
type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ 型エラー: キー 'nmae' が User に見つかりませんTypeScriptを使ったことがある方は、Luauにはinterfaceキーワードがない点に注意してください。あらゆる形をtypeで扱います。また、「宣言のマージ」もありません。同じスコープ内で同じ名前の型を2つ宣言するとエラーになるため、それぞれの形には定義が1つだけあります。
Luauの形は構造的です。どこで、どのように作成されたかにかかわらず、正しい型のフィールドを持つテーブルはどれも一致します。一方、緩いテーブルにも出番はあります。短いスクリプトや、本当に動的なデータには形の宣言は必要ありません。ただし、関数間で渡すデータには、間違いがまだ簡単に修正できるうちに形で検出するのが有効です。
チャレンジ
簡単宣言した形を持つテーブルに変えましょう。
- テーブルの上に、
type Pet = {name: string, age: number}と書きます。 - テーブルに型注釈を付けます。
local pet: Pet = {name = "Biscuit", age = 3} - 最初の出力の下に、
print(pet.age)を追加します。
コードを実行を押すと、出力にBiscuitと3が表示されます。
自分で試してみよう
-- 制約の緩いテーブル:フィールドは何もチェックされない
local pet = {name = "Biscuit", age = 3}
print(pet.name)
Luau入門のすべてのレッスン
自分で練習してみよう: Luauオンラインコンパイラ