オプショナルなプロパティ
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が存在する場合は、引き続き文字列でなければなりません。
チャレンジ
簡単メールアドレスがない場合もある連絡先を表示しましょう。
type User = {name: string, email: string?}と書き、次にlocal mia: User = {name = "Mia", email = "mia@coddy.tech"}とlocal leo: User = {name = "Leo"}と書きます。local function printContact(user: User)と書き、メールアドレスがある場合は`{user.name}: {user.email}`を、ない場合は`{user.name}: no email`を表示します。mia、次にleoに対して呼び出します。
コードを実行を押します。出力に Mia: mia@coddy.tech と Leo: no email が表示されます。
自分で試してみよう
-- 1) 任意の email を持つ型 User を定義し、次に mia と leo を定義する
-- 2) email をチェックする printContact(user: User) を定義する
-- 3) mia、次に leo に対して呼び出す
Luau入門のすべてのレッスン
自分で練習してみよう: Luauオンラインコンパイラ