Menu
CoddyTech

オプショナルなプロパティ

CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 41/80。

すべてのフィールドが常に存在するとは限りません。Luaでは、存在しないテーブルフィールドを読み取ると単にnilになります。柔軟ではありますが、attempt to concatenate a nil valueのようなバグが紛れ込む原因にもなります。

Luauでは、型の後ろに?を付けて<形>を明示できます。フィールドをオプショナルとして指定します。

type User = {
    name: string,   -- 必須
    email: string?, -- 省略可能: string または nil
}

local alice: User = {name = "Alice", email = "alice@luau.dev"}
local bob: User = {name = "Bob"} -- ✓ 問題なし。email は省略可能

変数で以前学んだように、string?はstring | nilの省略形です。同じ考え方が、今度は型の個々のフィールドに適用されます。

オプショナルなフィールドはnilの可能性があるため、使う前に確認する必要があります。従来のLuaの書き方が使えます。また、strictモードでは、型チェッカーが分岐内で型を絞り込みます。

if bob.email then
    print(`email: {bob.email}`) -- ここではemailは文字列です
else
    print("no email on file")
end

オプショナルとは「存在しない場合がある」という意味です。「どんな型でもよい」という意味ではありません。emailが存在する場合は、引き続き文字列でなければなりません。

challenge icon

チャレンジ

簡単

メールアドレスがない場合もある連絡先を表示しましょう。

  1. type User = {name: string, email: string?} と書き、次に local mia: User = {name = "Mia", email = "mia@coddy.tech"} と local leo: User = {name = "Leo"} と書きます。
  2. local function printContact(user: User) と書き、メールアドレスがある場合は `{user.name}: {user.email}` を、ない場合は `{user.name}: no email` を表示します。
  3. mia、次に leo に対して呼び出します。

コードを実行を押します。出力に Mia: mia@coddy.tech と Leo: no email が表示されます。

自分で試してみよう

-- 1) 任意の email を持つ型 User を定義し、次に mia と leo を定義する
-- 2) email をチェックする printContact(user: User) を定義する
-- 3) mia、次に leo に対して呼び出す

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

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