Katı Modda Nil Güvenliği
Coddy'nin Lua Journey'sinin Luau'ya Giriş bölümünün bir parçası. Ders 71 / 73.
En yaygın Lua çökmesi “nil'i indekslemeye çalışma” hatasıdır: bir değerin var olduğunu varsayan, ancak değerin var olmadığı kod. Luau'nun yanıtı nil disiplinidir: --!strict altında, düz bir string hiçbir zaman nil olamaz. nil gerçek bir olasılıksa, tür bunu ? ile belirtmelidir:
--!strict
local nickname: string? = nil -- ok: string veya nil
local username: string = nil -- ✗ strict modunda tip hatasıBu disiplinin iki yönü vardır: bir string? verildiğinde, katı mod onu nil olmadığını kesinleştirene kadar bir dize olarak kullanmana izin vermez. Standart araç, tıpkı bir typeof denetimi gibi türü daraltan basit bir karşılaştırmadır:
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name burada string
end
return "NOBODY"
endnil geçerli bir durumdan ziyade bir hata olacaksa assert kullan: assert(x ~= nil) sonrasında denetleyici, kapsamın geri kalanında x'i nil olmayan bir değer olarak kabul eder ve çalışma zamanında assert, bozuk varsayımın çok uzakta bir yerde değil, gerçekleştiği noktada erkenden çöker.
Sonuç şudur: denetleyici, “eksik olabilir” durumundaki her değeri düzenleme sırasında ele almaya zorlar ve çalışma zamanı hatası hiç gerçekleşmez.
Görev
KolayEksik olabilecek kullanıcı profili alanlarını işleyin. Dosyanıza --!strict ile başlayın.
getDisplayName(fullName: string?): string:fullNamedeğerinildeğilse onu, aksi takdirdeAnonymous Userdeğerini döndürür.formatEmail(email: string?): string: e-postanildeğilse küçük harfe dönüştürülmüş e-postayı (string.lower), aksi takdirdeNo email provideddeğerini döndürür.getUserInfo(name: string?, email: string?): string: her iki işlevi kullanır veName: [processed name], Email: [processed email]değerini döndürür.
Ardından her birini kendi satırında yazdırın:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)getUserInfo("Sarah Wilson", nil)
Kendin dene
--!strict
-- Kodu buraya yaz
-- 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 — ikisini birleştir
-- 4) görevdeki yedi test çağrısını yazdır
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Luau'ya Giriş bölümündeki tüm dersler
1Luau ile Başlarken
Luau Nedir?Neden Luau Kullanılmalı?İlk Luau KodunuzTip Denetimi ve Hata ModlarıÖzet: Luau'ya Giriş4Fonksiyonlarla Çalışmak
Parametreleri ve Geri Dönüş Değerlerini TiplendirmeAnonim Fonksiyonları TiplendirmeHiçbir Şey Döndürmeyen Fonksiyonlarİsteğe Bağlı ParametrelerVarsayılan Parametre DeğerleriDeğişken Sayıda Parametre Alan Fonksiyonlar (Variadic)Fonksiyon Tiplerini TanımlamaÖzet: Tiplendirilmiş Fonksiyonlar2Temel Tipler
Temel Tipler: num, str, bool'any' Tipi: Kaçış Yolu'unknown' TipiNil ve İsteğe Bağlı (Optional) TiplerUygulamada Tip ÇıkarımıAçık Tip BelirteçleriÖzet: Temel Tipler Pratiği5Diğer Adlar (Aliases), Birleşimler, Kesişimler
İlkel Tipler için Tip Diğer Adları (Type Aliases)Birleşim Tipleri (Union Types)Birleşim Tipleri ile ÇalışmakLiteral (Sabit) TiplerKesişim Tipleri (Intersection Types)Tip Diğer Adlarını BirleştirmeÖzet: Gelişmiş Tip Kombinasyonları8Enum'lar: Luau Yöntemi
Luau'da Enum DeseniTablolar ile Sayısal Enum'larBirlik Olarak Metin Enum'larıHarfi Birlik Enum'larını KullanmaSabit Tabloları DondurmaÖzet: Enum'lar, Luau Yöntemi11İleri Düzey Konular
Tür Doğrulamaları (Type Assertions)typeof ile Tür Muhafızları (Type Guards)never TürüKatı Modda Nil GüvenliğiDizin İmzaları (Index Signatures)Özet: Türlerde İnce Ayar Yapma3Tipli Tablolar: Diziler ve Map'ler
Tipli DizilerEleman Ekleme ve OkumaMap Tipi Nedir?Map Bildirimi ve Map'lere ErişimTablolar Üzerinde YinelemeKarma Biçimli TablolarÇok Boyutlu Tipli Dizilertable.unpack ve VarargsÖzet: Diziler ve Map'lerKendi başına pratik yap: Online Lua derleyicisi