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 ketatDisiplin 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"
endJika 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.
Tantangan
MudahProses field profil pengguna yang mungkin tidak ada. Mulai file-mu dengan --!strict.
getDisplayName(fullName: string?): string: mengembalikanfullNamejika nilainya bukannil, jika tidak,Anonymous User.formatEmail(email: string?): string: mengembalikan email dalam huruf kecil (string.lower) jika nilainya bukannil, jika tidak,No email provided.getUserInfo(name: string?, email: string?): string: menggunakan kedua fungsi dan mengembalikanName: [processed name], Email: [processed email].
Lalu cetak, masing-masing pada baris tersendiri:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pengantar Luau
1Memulai dengan Luau
Apa Itu Luau?Mengapa Menggunakan Luau?Kode Luau PertamamuPemeriksaan Tipe dan Mode ErrorRangkuman: Pengenalan Luau4Bekerja dengan Fungsi
Menentukan Tipe Parameter dan Nilai KembalianMenentukan Tipe Fungsi AnonimFungsi yang Tidak Mengembalikan NilaiParameter OpsionalNilai Default ParameterFungsi VariadikMendefinisikan Tipe FungsiRangkuman: Fungsi Bertipe2Tipe Inti
Tipe Dasar: num, str, boolTipe 'any': Jalan Keluar DaruratTipe 'unknown'Nil & Tipe OpsionalInferensi Tipe dalam PraktikAnotasi Tipe EksplisitUlasan: Latihan Tipe Inti5Alias, Union, dan Intersection
Alias Tipe untuk Tipe PrimitifTipe UnionMenggunakan Tipe UnionTipe LiteralTipe IntersectionMenggabungkan Alias TipeRekap: Kombinasi Tipe Lanjutan8Enum, Cara Luau
Pola Enum di LuauEnum Numerik dengan TabelEnum String sebagai UnionMenggunakan Enum Union LiteralMembekukan Tabel KonstantaUlasan: Enum, Cara Luau11Topik Lanjutan
Assertion TipePenjaga Tipe dengan typeofTipe neverKeamanan Nil dalam Mode StrictSignature IndeksRangkuman: Menyempurnakan Tipe3Tabel Bertipe: array dan Map
array BertipeMenambahkan dan Membaca ElemenApa Itu Tipe Map?Mendeklarasikan dan Mengakses MapMelakukan Iterasi pada TabelTabel dengan Bentuk Campuranarray Bertipe Multidimensitable.unpack dan VarargsRingkasan: array dan MapLatihan sendiri: Compiler Luau online