オプショナルなプロパティ
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 39/73。
すべての field が常に存在するとは限りません。Lua では、存在しないテーブルの field を読むと単に nil になります。これは柔軟ですが、attempt to concatenate a nil value のようなバグが忍び込む原因にもなります。
Luau では、shape にこれを明示させることができます。field の型の後に ? を追加して、optional であることを示します。
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 の省略形です。同じ考え方を、shape の個々の field にも適用できるようになりました。
optional な field は nil になる可能性があるため、使用する前に check する必要があります。従来の Lua のパターンが使え、strict mode では checker が分岐内で型を絞り込みます。
if bob.email then
print(`email: {bob.email}`) -- ここで email は string です
else
print("no email on file")
endoptional は「存在しない可能性がある」という意味です。「どのような型でもよい」という意味ではありません。email が存在する場合、それは依然として string でなければなりません。
チャレンジ
簡単Userという名前の型エイリアスを作成し、以下を定義します:
- 型が
stringのname(必須) - 型が
string?のemail(オプション)
2つのユーザーを作成します:
alice:名前は"Alice"、メールアドレスは"alice@luau.dev"bob:名前は"Bob"、メールアドレスなし
Userを受け取るprintContact関数を作成します。ユーザーにメールアドレスがある場合は[name] - [email]を出力し、それ以外の場合は[name] - no emailを出力します。
次に:
printContact(alice)をcallするprintContact(bob)をcallするbob.email == nilを比較した結果を出力する
自分で試してみよう
-- ここにコードを書いてください
-- 1) オプショナルなemailフィールドを持つ型Userを定義する
-- 2) alice(emailあり)とbob(なし)を作成する
-- 3) nilチェック付きのprintContactを書く
-- 4) 両方のユーザーに対して呼び出し、その後bob.email == nilを出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ