Menu
CoddyTech

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

nilが有効なケースではなくバグになる場合は、assertを使いましょう。assert(x ~= nil)の後は、チェッカーはスコープの残りの部分でxをnilではないものとして扱います。また、実行時には、はるか離れた場所ではなく、前提が崩れたその時点でassertがすぐにクラッシュします。

その効果として、編集時にチェッカーが「欠けているかもしれない」値をすべて処理するよう促すため、実行時エラーは起こらなくなります。

challenge icon

チャレンジ

簡単

安全な代替値が必要になることがある名前を付けましょう。

  1. 1行目に--!strictを置いたままにします。
  2. local function getDisplayName(fullName: string?): stringを書き、nilでない場合はfullNameを返し、それ以外の場合は"Anonymous User"を返します。
  3. 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オンラインコンパイラ