オプショナルなプロパティ
CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 39/73。
すべてのフィールドが常に存在するとは限りません。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 が存在する場合、それは依然として string でなければなりません。
チャレンジ
簡単以下のフィールドを持つ User という名前の型エイリアスを作成します:
- 型
stringのname(必須) - 型
string?のemail(オプショナル)
2人のユーザーを作成します:
alice— 名前"Alice"、メール"alice@luau.dev"bob— 名前"Bob"、メールなし
User を受け取る関数 printContact を作成します。ユーザーがメールを持っている場合は [name] - [email] を出力し、それ以外の場合は [name] - no email を出力します。
その後:
printContact(alice)を呼び出しますprintContact(bob)を呼び出しますbob.email == nilの比較結果を出力します
自分で試してみよう
-- ここにコードを書く
-- 1) オプショナルなemailフィールドを持つUser型を定義する
-- 2) alice(emailあり)とbob(なし)を作成する
-- 3) nilチェック付きのprintContactを書く
-- 4) 両方のユーザーに対して呼び出し、その後bob.email == nilを出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数