Menu
Coddy logo textTech

厳格モードにおける Nil 安全性

CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 71/73。

Luaで最もよくあるクラッシュは「nilをインデックスしようとした」です。これは、値が存在すると想定したコードで、実際には存在しなかった場合に起こります。Luauの答えはnilの規律です。--!strictの下では、単純なstring決してnilになることはありません。nilが実際に起こり得る場合は、型に?を付けて明示する必要があります:

--!strict
local nickname: string? = nil   -- ok: string または nil
local username: string = nil    -- ✗ 厳格モードでの型エラー

この規律は両方向に働きます。string?が与えられた場合、nilではないことを確認するまで、strict modeではそれをstringとして使うことはできません。標準的な方法は単純な比較で、typeofガードと同じように型を絞り込みます:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- ここで name は string です
    end
    return "NOBODY"
end

nilが有効なケースではなくバグになる場合は、assertを使います。assert(x ~= nil)の後、チェッカーはスコープの残りの部分でxをnilではないものとして扱います。また実行時には、壊れた前提から遠く離れた場所ではなく、その時点で早期にassertがクラッシュするため、問題を見つけやすくなります。

その効果は、編集している間に「存在しないかもしれない」すべての値をチェッカーが処理するよう強制し、実行時エラーがそもそも発生しなくなることです。

challenge icon

チャレンジ

簡単

欠落している可能性のあるユーザープロファイルのフィールドを処理します。ファイルの先頭に --!strict を記述してください。

  • getDisplayName(fullName: string?): stringfullNamenil でない場合はそれを返し、それ以外の場合は Anonymous User を返します。
  • formatEmail(email: string?): stringemailnil でない場合は、メールアドレスを小文字にして(string.lower)返し、それ以外の場合は No email provided を返します。
  • getUserInfo(name: string?, email: string?): string:両方の関数を使用し、Name: [processed name], Email: [processed email] を返します。

次に、それぞれを別の行に出力します:

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. getUserInfo("Sarah Wilson", nil)

自分で試してみよう

--!strict
-- ここにコードを書いてください
-- 1) getDisplayName(fullName: string?): string — nil-check, fallback "Anonymous User"
-- 2) formatEmail(email: string?): string — string.lower or "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — 両方を組み合わせる
-- 4) タスクからの7つのテスト呼び出しを出力する
quiz icon腕試し

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

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

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