リテラルユニオンEnumの活用
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 54/73。
リテラルユニオンはfunctionのパラメーターとして真価を発揮します。パラメーターをユニオンで型付けすると、チェッカーによって、そのfunctionが有効なメンバーでのみ呼び出されることが保証されます。
type Direction = "up" | "down" | "left" | "right"
local function move(direction: Direction)
print(`Moving {direction}...`)
end
move("left") -- ✓
move("north") -- ✗ 型エラー: Directionではないfunctionの内部では、membersを網羅的に処理するためにif/elseifチェーンを使います。型によってinputが4つの値に制限されているため、3つをチェックして、残りの1つをelseに任せれば、すべてをカバーできます。
local function describe(direction: Direction): string
if direction == "up" then
return "Going upward"
elseif direction == "down" then
return "Going downward"
elseif direction == "left" then
return "Turning left"
else
return "Turning right"
end
end1つ注意点があります。io.read()のように外部から到着する文字列は、ユーザーが何を入力するかをチェッカーが把握できないため、通常のstringとして型付けされます。先ほど学んだ::のcastは、その値を列挙型として扱うようにチェッカーに指示します。
local direction = io.read() :: Directioncastは約束であって、チェックではありません。実行時には、inputを検証するものは何もありません。本番コードではまず検証しますが、ここでは型付けされたfunctionがユーザーのinputを簡潔に受け取れるようにしています。
チャレンジ
簡単"up"、"down"、"left"、"right"をメンバーとするリテラル共用体型 Direction を作成します。
direction: Direction を受け取り、Moving [direction]... を出力する関数 move を作成します。
direction: Direction を受け取り、string を返し、if/elseif/else ですべてのメンバーを処理する関数 getMovementDescription を作成します。
"up"→Going upward"down"→Going downward"left"→Turning left"right"→Turning right
io.read() を使ってユーザーから1行読み取り、:: を使って Direction にキャストします。その後:
- direction を使って
moveを call します - 同じ direction に対する
getMovementDescriptionの結果を出力します
自分で試してみよう
-- ここにコードを書いてください
-- 1) 型 Direction を定義する
-- 2) move と getMovementDescription を書く (if/elseif/else)
-- 3) 入力を読み取る: local direction = io.read() :: Direction
-- 4) move を呼び出し、その後 description を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数8Enum、Luau流のアプローチ
LuauにおけるEnumパターンテーブルによる数値Enumユニオン型としての文字列EnumリテラルユニオンEnumの活用定数テーブルのフリーズまとめ:Enum、Luau流のアプローチ自分で練習してみよう: Luaオンラインコンパイラ