String Biçimlendirme
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 16 / 70.
Bir nesneyi doğrudan yazdırdığınızda, Lua table: 0x55a... gibi pek yardımcı olmayan bir şey gösterir—sadece bir bellek adresi. __tostring metametodu, nesneniz yazdırıldığında veya metne dönüştürüldüğünde onu tam olarak hangi dizginin temsil edeceğini tanımlamanıza olanak tanır.
Sınıf deseninde, __tostring öğesini sınıf tablonuzda bir fonksiyon olarak eklersiniz. Sınıfın kendisi örnekler için metatablo görevi gördüğünden, Lua bu fonksiyonu 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 .. ")"
endArtık bir Player örneğini yazdırdığınızda, Lua otomatik olarak __tostring metodunuzu çağırır:
local hero = Player:new("Luna", 5)
print(hero) -- Çıktı: Player: Luna (Seviye 5)__tostring'in iki nokta üst üste sözdizimini kullandığına ve self parametresini aldığına dikkat edin; bu, tüm örnek verilerine erişmenizi sağlar. Fonksiyon bir dize döndürmelidir; herhangi bir özniteliği okunabilir bir temsilde birleştirerek, nesneniz için mantıklı olan herhangi bir şekilde biçimlendirebilirsiniz.
Görev
KolayKendini nasıl tanıtacağını bilen bir Book sınıfı oluşturalım! Bir kitabı doğrudan yazdırdığınızda, Lua karmaşık bir bellek adresi yerine güzelce biçimlendirilmiş bir dize görüntüleyecektir; bunların hepsi __tostring metametodu sayesindedir.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Book.lua: Standart prototip deseniyleBooksı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 formatta görüntülemesi için__tostringmetametodunu uygulayın.main.lua: Book modülünüzü dahil edin (require), kitap örnekleri oluşturun ve özel dize biçimlendirmenizin işleyişini görmek için bunları doğrudan yazdırın.
__tostring metodunuz tam olarak şu formatta bir dize döndürmelidir:
"[title]" by [author]Çıktı dizesinde başlığın çift tırnak içine alındığına dikkat edin.
Dört girdi alacaksınız:
- Birinci kitabın başlığı
- Birinci kitabın yazarı
- İkinci kitabın başlığı
- İkinci kitabın yazarı
Ana dosyanızda, sağlanan girdileri kullanarak iki kitap oluşturun ve her kitabı doğrudan yazdırın (bir metot çağırarak değil, sadece print(book) ile). 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 metodunun bir dize döndürmesi gerektiğini ve sınıf tablonuz örnekler için metatablo görevi gördüğünden, bir kitabı yazdırdığınızda Lua'nın __tostring fonksiyonunuzu otomatik olarak bulup kullanacağını unutmayın.
Kopya kağıdı
__tostring metametodu, bir nesnenin yazdırıldığında veya metne dönüştürüldüğünde bir dize olarak nasıl temsil edileceğini tanımlar.
__tostring olmadan, bir nesneyi yazdırmak yalnızca onun bellek adresini gösterir:
print(someObject) -- Output: table: 0x55a...Dize temsilini özelleştirmek için sınıfınıza bir metot olarak __tostring ekleyin:
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 .. ")"
endBir örneği (instance) yazdırdığınızda, Lua otomatik olarak __tostring metodunu çağırır:
local hero = Player:new("Luna", 5)
print(hero) -- Output: Player: Luna (Level 5)Önemli noktalar:
- Metodun
selfparametresini alması için iki nokta üst üste sözdizimini (:) kullanın - Mutlaka bir dize (string) döndürmelidir
- Örnek verilerine
selfüzerinden erişin - Sınıf tablosu metatablo görevi gördüğü için Lua,
__tostringmetodunu otomatik olarak bulur
Kendin dene
-- Book modülünü dahil et
local Book = require('Book')
-- Girdileri oku
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- YAPILACAK: Book:new() kullanarak iki kitap örneği oluşturun
-- YAPILACAK: Her kitabı doğrudan yazdırın (sadece print(book) kullanın)
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming 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şisi