Nesneleri Çıkarma
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 27 / 70.
Tıpkı __add'in + operatörünü işlemesi gibi, __sub metametodu - operatörü için davranışı tanımlar. Kalıp aynıdır; iki operand alan ve yeni bir nesne döndüren bir fonksiyon tanımlarsınız.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endRGB renkleriyle çalışırken, çıkarma işlemi negatif değerler üretebilir. Gerçek uygulamalarda, sonuçları geçerli aralıklara (0-255) sınırlamak isteyebilirsiniz, ancak temel metametot yapısı aynı kalır.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- Çıktı: 150 120 80Unutmayın: __sub metodunu nokta ile (iki nokta üst üste değil) tanımlayın, çünkü bu, Lua'nın her iki işleneni de argüman olarak kullanarak doğrudan çağırdığı bir metametottur.
Görev
Kolay- operatörünü kullanarak çıkarmayı destekleyen bir Color sınıfı oluşturalım. Renkler RGB değerleriyle temsil edilir ve bir rengi diğerinden çıkarmak, her bir bileşenin farkıyla yeni bir renk oluşturur.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Color.lua: Kırmızı, yeşil ve mavi değerlerini temsil edenr,gvebbileşenlerine sahip Color sınıfınızı tanımlayın. Bir:new(r, g, b)kurucusu ekleyin ve iki rengin çıkarılmasının bileşen bazlı farklarla yeni bir renk oluşturması için__submetametodunu uygulayın.__submetodunun nokta sözdizimini kullandığını ve her iki işleneni de argüman olarak aldığını unutmayın.main.lua: Color modülünüzü dahil edin (require), sağlanan girdilerden renk örnekleri oluşturun, bunları birbirinden çıkarın ve sonuçta oluşan RGB değerlerini görüntüleyin.
Altı adet girdi alacaksınız:
- Birinci rengin kırmızı bileşeni
- Birinci rengin yeşil bileşeni
- Birinci rengin mavi bileşeni
- İkinci rengin kırmızı bileşeni
- İkinci rengin yeşil bileşeni
- İkinci rengin mavi bileşeni
Ana dosyanızda, verilen RGB değerleriyle iki renk oluşturun, - operatörünü kullanarak ikinci rengi birinciden çıkarın ve sonuçta oluşan rengin r, g ve b değerlerini ayrı satırlara yazdırın.
Örneğin, girdiler 200, 150, 100, 50, 30, 20 ise çıktı şu şekilde olmalıdır:
150
120
80Birinci renk (200, 150, 100) eksi ikinci renk (50, 30, 20), yeni bir renge (150, 120, 80) eşittir.
Kopya kağıdı
__sub metametodu, - operatörü için davranışı tanımlar. İki işlenen alır ve yeni bir nesne döndürür.
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end__sub metodunu nokta ile tanımlayın (iki nokta üst üste değil), çünkü bu Lua'nın her iki işleneni de argüman olarak doğrudan çağırdığı bir metametoddur.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- Çıktı: 150 120 80Kendin dene
-- Color modülünü dahil et
local Color = require('Color')
-- Giriş değerlerini oku
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: Verilen RGB değerleriyle iki Color örneği oluşturun
-- TODO: - operatörünü kullanarak ikinci rengi birinciden çıkarın
-- TODO: Sonuç renginin r, g ve b değerlerini ayrı satırlara yazdırı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