厳格モードにおける 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"
endnilが有効なケースではなくバグになる場合は、assertを使います。assert(x ~= nil)の後、チェッカーはスコープの残りの部分でxをnilではないものとして扱います。また実行時には、壊れた前提から遠く離れた場所ではなく、その時点で早期にassertがクラッシュするため、問題を見つけやすくなります。
その効果は、編集している間に「存在しないかもしれない」すべての値をチェッカーが処理するよう強制し、実行時エラーがそもそも発生しなくなることです。
チャレンジ
簡単欠落している可能性のあるユーザープロファイルのフィールドを処理します。ファイルの先頭に --!strict を記述してください。
getDisplayName(fullName: string?): string:fullNameがnilでない場合はそれを返し、それ以外の場合はAnonymous Userを返します。formatEmail(email: string?): string:emailがnilでない場合は、メールアドレスを小文字にして(string.lower)返し、それ以外の場合はNo email providedを返します。getUserInfo(name: string?, email: string?): string:両方の関数を使用し、Name: [processed name], Email: [processed email]を返します。
次に、それぞれを別の行に出力します:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)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つのテスト呼び出しを出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ