Strictモードでのnil安全性
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 77/80。
Luaで最もよくあるクラッシュは"attempt to index nil"です。値が存在しないのに、存在すると仮定したコードが原因です。Luauの答えはnilの取り扱いを徹底することです。--!strictの下では、単なるstringがnilになることはありません。nilになる可能性が本当にあるなら、型に?を付けて明示する必要があります。
--!strict
local nickname: string? = nil -- OK: string または nil
local username: string = nil -- ✗ strict モードでは型エラーこのルールは両方向に働きます。string?を受け取った場合、nilではないと確認するまでは、strictモードではそれを文字列として使えません。標準的な方法は単純な比較です。これは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がすぐにクラッシュします。
その効果として、編集時にチェッカーが「欠けているかもしれない」値をすべて処理するよう促すため、実行時エラーは起こらなくなります。
チャレンジ
簡単安全な代替値が必要になることがある名前を付けましょう。
- 1行目に
--!strictを置いたままにします。 local function getDisplayName(fullName: string?): stringを書き、nilでない場合はfullNameを返し、それ以外の場合は"Anonymous User"を返します。getDisplayName("John Smith")とgetDisplayName(nil)を出力します。
Run Codeを押します。出力にはJohn SmithとAnonymous Userが表示されます。
自分で試してみよう
--!strict
-- 1) getDisplayName(fullName: string?): string を定義し、値がない場合は "Anonymous User" を返す
-- 2) "John Smith" と nil について、その結果を出力する
Luau入門のすべてのレッスン
自分で練習してみよう: Luauオンラインコンパイラ