Menu
CoddyTech

リテラルユニオン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

キャストは保証であって、チェックではありません。実行時に入力が検証されることはありません。本番コードではまず検証しますが、ここでは型付き関数がユーザー入力をそのまま受け取れるようにしています。

challenge icon

チャレンジ

簡単

プレイヤーが入力した方向をアクションに変換します。

  1. type Direction = "up" | "down" | "left" | "right"と書きます。
  2. local function getAction(direction: Direction): stringを書き、"Climb"、"Drop"、"Turn left"、または"Turn right"を返します。
  3. local direction = io.read() :: Directionで読み取り、getAction(direction)を出力します。

「コードを実行」を押します。入力がupの場合、出力にClimbと表示されます。

自分で試してみよう

-- 1) type Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction を実行し、その後アクションを出力する

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

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