Menu
CoddyTech

形状 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の形は構造的です。どこで、どのように作成されたかにかかわらず、正しい型のフィールドを持つテーブルはどれも一致します。一方、緩いテーブルにも出番はあります。短いスクリプトや、本当に動的なデータには形の宣言は必要ありません。ただし、関数間で渡すデータには、間違いがまだ簡単に修正できるうちに形で検出するのが有効です。

challenge icon

チャレンジ

簡単

宣言した形を持つテーブルに変えましょう。

  1. テーブルの上に、type Pet = {name: string, age: number}と書きます。
  2. テーブルに型注釈を付けます。local pet: Pet = {name = "Biscuit", age = 3}
  3. 最初の出力の下に、print(pet.age)を追加します。

コードを実行を押すと、出力にBiscuitと3が表示されます。

自分で試してみよう

-- 制約の緩いテーブル:フィールドは何もチェックされない
local pet = {name = "Biscuit", age = 3}
print(pet.name)

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

自分で練習してみよう: Luauオンラインコンパイラ