String Biçimlendirme
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 16 / 70.
Bir nesneyi doğrudan yazdırdığında Lua, table: 0x55a... gibi pek yardımcı olmayan bir şey gösterir. Yalnızca bir bellek adresi. __tostring metametodu, nesnen yazdırıldığında veya metne dönüştürüldüğünde onu tam olarak hangi dizenin temsil edeceğini tanımlamanı sağlar.
Sınıf deseninde, sınıf tablonuza bir işlev olarak __tostring eklersiniz. Sınıfın kendisi örnekler için metatablo görevi gördüğünden Lua bu işlevi otomatik olarak bulur ve kullanır:
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endŞimdi bir Player örneğini yazdırdığınızda Lua, __tostring metodunuzu otomatik olarak çağırır:
local hero = Player:new("Luna", 5)
print(hero) -- Çıktı: Player: Luna (Level 5)__tostring işlevinin iki nokta üst üste söz dizimini kullandığına ve self aldığına dikkat edin; bu sayede tüm örnek verilerine erişebilirsiniz. İşlev bir dize döndürmelidir. Nesneniz için anlamlı olduğu şekilde biçimlendirebilir, tüm öznitelikleri okunabilir bir gösterimde birleştirebilirsiniz.
Görev
KolayKendini tanıtmayı bilen bir Book sınıfı oluşturalım! Bir kitabı doğrudan yazdırdığınızda Lua, anlaşılması güç bir bellek adresi yerine düzgün biçimlendirilmiş bir dize görüntüler: tüm bunlar __tostring metamethod'u sayesinde gerçekleşir.
Kodunuzu iki dosyaya ayıracaksınız:
Book.lua: Standart prototip kalıbını kullanarakBooksınıfınızı tanımlayın. Her kitap birtitleve birauthorsaklamalıdır. Bir:new(title, author)kurucusu ekleyin ve bir kitabı yazdırmanın bilgilerini okunabilir bir biçimde görüntülemesini sağlamak için__tostringmetamethod'unu uygulayın.main.lua: Book modülünü require edin, kitap örnekleri oluşturun ve özel dize biçimlendirmenizi çalışırken görmek için bunları doğrudan yazdırın.
__tostring metodunuz tam olarak şu biçimde bir dize döndürmelidir:
"[title]" by [author]Başlığın çıktı dizesi içinde çift tırnaklarla çevrelendiğine dikkat edin.
Dört girdi alacaksınız:
- İlk kitabın başlığı
- İlk kitabın yazarı
- İkinci kitabın başlığı
- İkinci kitabın yazarı
Ana dosyanızda, verilen girdileri kullanarak iki kitap oluşturun ve her kitabı doğrudan (bir metodu çağırarak değil, yalnızca print(book) kullanarak) yazdırın. Her kitap kendi satırında görünmelidir.
Örneğin girdiler The Hobbit, J.R.R. Tolkien, 1984 ve George Orwell ise çıktı şöyle olmalıdır:
"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwell__tostring'un bir dize döndürmesi gerektiğini ve sınıf tablonuz örnekler için metatablo görevi gördüğünden, Lua'nın bir kitabı yazdırdığınızda __tostring işlevinizi otomatik olarak bulup kullanacağını unutmayın.
Kendin dene
-- Book modülünü yükle
local Book = require('Book')
-- Girdileri oku
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: Book:new() kullanarak iki kitap örneği oluştur
-- TODO: Her kitabı doğrudan yazdır (sadece print(book) kullan)
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil HiyerarşisiKendi başına pratik yap: Online Lua derleyicisi