Menu
CoddyTech

Keamanan Nil dalam Mode Strict

Termasuk bagian Pengantar Luau dalam perjalanan Lua di Coddy. Pelajaran 71 dari 73.

Crash Lua yang paling umum adalah "mencoba mengindeks nil": kode yang mengasumsikan suatu nilai ada, padahal tidak. Jawaban Luau adalah disiplin nil: dengan --!strict, string biasa tidak akan pernah bisa berupa nil. Jika nil memang mungkin, tipe tersebut harus menyatakannya dengan ?:

--!strict
local nickname: string? = nil   -- ok: string OR nil
local username: string = nil    -- ✗ error tipe dalam mode ketat

Disiplin ini berlaku dua arah: jika diberi string?, strict mode tidak akan membiarkanmu menggunakannya sebagai string sebelum kamu memastikan nil bukan nilainya. Cara standar untuk melakukannya adalah perbandingan biasa, yang mempersempit tipe seperti guard typeof:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- name adalah string di sini
    end
    return "NOBODY"
end

Jika nil akan menjadi bug, bukan kasus yang valid, gunakan assert: setelah assert(x ~= nil), pemeriksa tipe menganggap x bukan nil selama sisa cakupan, dan saat runtime, assert akan menyebabkan crash lebih awal, tepat saat asumsi itu terbukti keliru, bukan di tempat yang jauh.

Manfaatnya: pemeriksa tipe memaksamu menangani setiap nilai yang "mungkin tidak ada" saat kamu mengedit, sehingga error runtime itu tidak pernah terjadi.

challenge icon

Tantangan

Mudah

Proses field profil pengguna yang mungkin tidak ada. Mulai file-mu dengan --!strict.

  • getDisplayName(fullName: string?): string: mengembalikan fullName jika nilainya bukan nil, jika tidak, Anonymous User.
  • formatEmail(email: string?): string: mengembalikan email dalam huruf kecil (string.lower) jika nilainya bukan nil, jika tidak, No email provided.
  • getUserInfo(name: string?, email: string?): string: menggunakan kedua fungsi dan mengembalikan Name: [processed name], Email: [processed email].

Lalu cetak, masing-masing pada baris tersendiri:

  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)

Coba sendiri

--!strict
-- Tulis kodemu di sini
-- 1) getDisplayName(fullName: string?): string, periksa nil, gunakan "Anonymous User" sebagai nilai cadangan
-- 2) formatEmail(email: string?): string, gunakan string.lower atau "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string, gabungkan keduanya
-- 4) cetak tujuh pemanggilan uji dari tugas
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pengantar Luau

Latihan sendiri: Compiler Luau online