Menu
Coddy logo textTech

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 .. ")"
end

Artı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.

challenge icon

Görev

Kolay

Kendini 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 deseniyle Book sınıfınızı tanımlayın. Her kitap bir title ve bir author saklamalıdır. Bir :new(title, author) kurucusu ekleyin ve bir kitabı yazdırmanın bilgilerini okunabilir bir formatta görüntülemesi için __tostring metametodunu 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:

  1. Birinci kitabın başlığı
  2. Birinci kitabın yazarı
  3. İkinci kitabın başlığı
  4. İ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 .. ")"
end

Bir ö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 self parametresini 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, __tostring metodunu 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)

quiz iconKendini test et

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