Menu
Coddy logo textTech

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

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 でなければなりません。

challenge icon

チャレンジ

簡単

以下のフィールドを持つ User という名前の型エイリアスを作成します:

  • stringname(必須)
  • string?email(オプショナル)

2人のユーザーを作成します:

  • alice — 名前 "Alice"、メール "alice@luau.dev"
  • bob — 名前 "Bob"、メールなし

User を受け取る関数 printContact を作成します。ユーザーがメールを持っている場合は [name] - [email] を出力し、それ以外の場合は [name] - no email を出力します。

その後:

  1. printContact(alice) を呼び出します
  2. printContact(bob) を呼び出します
  3. bob.email == nil の比較結果を出力します

自分で試してみよう

-- ここにコードを書く
-- 1) オプショナルなemailフィールドを持つUser型を定義する
-- 2) alice(emailあり)とbob(なし)を作成する
-- 3) nilチェック付きのprintContactを書く
-- 4) 両方のユーザーに対して呼び出し、その後bob.email == nilを出力する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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