Menu
Coddy logo textTech

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

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")
end

optional は「存在しない可能性がある」という意味です。「どのような型でもよい」という意味ではありません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)をcallする
  2. printContact(bob)をcallする
  3. bob.email == nilを比較した結果を出力する

自分で試してみよう

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

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

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

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