リテラルユニオンEnumの活用
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 58/80。
リテラルユニオンは関数の引数で特に役立ちます。引数をユニオン型にすると、チェッカーによって、有効なメンバーだけを指定して関数が呼び出されることが保証されます。
type Direction = "up" | "down" | "left" | "right"
local function move(direction: Direction)
print(`Moving {direction}...`)
end
move("left") -- ✓
move("north") -- ✗ 型エラー: Direction ではない関数内では、if/elseifチェーンを使ってすべてのメンバーを漏れなく処理します。型によって入力が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
end一点注意があります。io.read()のように外部から渡される文字列は、チェッカーにはユーザーが何を入力するかわからないため、単なるstring型になります。Luauのキャスト演算子::を使うと、この問題を解決できます。value :: Typeと書くと、値をその型として扱うようチェッカーに伝えられます。このセクションの終わり近くにある「型アサーション」のレッスンでキャストについて詳しく説明します。今は、次の1行で十分です。
local direction = io.read() :: Directionキャストは保証であって、チェックではありません。実行時に入力が検証されることはありません。本番コードではまず検証しますが、ここでは型付き関数がユーザー入力をそのまま受け取れるようにしています。
チャレンジ
簡単プレイヤーが入力した方向をアクションに変換します。
type Direction = "up" | "down" | "left" | "right"と書きます。local function getAction(direction: Direction): stringを書き、"Climb"、"Drop"、"Turn left"、または"Turn right"を返します。local direction = io.read() :: Directionで読み取り、getAction(direction)を出力します。
「コードを実行」を押します。入力がupの場合、出力にClimbと表示されます。
自分で試してみよう
-- 1) type Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction を実行し、その後アクションを出力する
Luau入門のすべてのレッスン
8Enum、Luau流のアプローチ
LuauにおけるEnumパターンテーブルによる数値Enumユニオン型としての文字列EnumリテラルユニオンEnumの活用定数テーブルのフリーズまとめ:Enum、Luau流のアプローチ自分で練習してみよう: Luauオンラインコンパイラ