Nesneleri Karşılaştırma (<, >)
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 29 / 70.
Aritmetik ve birleştirmenin ötesinde, karşılaştırma metametotlarını kullanarak nesnelerin birbirleriyle nasıl karşılaştırılacağını da tanımlayabilirsiniz. __lt metametodu "küçüktür" (<code><) operatörünü işler.
Lua a < b ifadesini değerlendirdiğinde, metatabloda __lt araması yapar. Bu metametot, karşılaştırma mantığınıza göre true veya false döndürmelidir.
local Item = {}
Item.__index = Item
function Item:new(name, price)
local obj = {name = name, price = price}
setmetatable(obj, Item)
return obj
end
function Item.__lt(a, b)
return a.price < b.price
end__lt tanımlandığında, artık öğeleri doğrudan karşılaştırabilirsiniz:
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- Output: true
print(laptop < apple) -- Output: falseİşte işin zekice kısmı: Lua, operatörünü otomatik olarak __lt'den türetir. Siz a > b yazdığınızda, Lua bunun yerine sadece b < a ifadesini değerlendirir. Böylece sadece __lt tanımlamak, size her iki karşılaştırma yönünü de bedavaya sağlar.
Görev
KolayFiyata göre <code>< ve operatörleri kullanılarak karşılaştırılabilen bir Product sınıfı oluşturalım. Bu, bir alışveriş sepetindeki öğeleri sıralamak veya bir listedeki en ucuz seçeneği bulmak gibi senaryolar için mükemmeldir.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Product.lua:namevepricealanlarına sahip Product sınıfınızı tanımlayın. Bir:new(name, price)yapıcı metodu (constructor) ekleyin ve ürünleri fiyatlarına göre karşılaştırmak için__ltmetametodunu uygulayın.__lttanımlamanın size otomatik olarakoperatörünü de kazandıracağını unutmayın—Lua bunu sizin yerinize halleder!main.lua: Product modülünüzü dahil edin (require), girdilerden ürün örnekleri oluşturun ve hangisinin daha pahalı veya daha ucuz olduğunu belirlemek için bunları karşılaştırın.
Dört girdi alacaksınız:
- Birinci ürünün adı
- Birinci ürünün fiyatı
- İkinci ürünün adı
- İkinci ürünün fiyatı
Ana dosyanızda, verilen ad ve fiyatlarla iki ürün oluşturun. Ardından üç karşılaştırma yapın ve her birinin sonucunu ayrı bir satıra yazdırın:
- Birinci ürün ikinciden küçük mü? (
trueveyafalseyazdırın) - Birinci ürün ikinciden büyük mü? (
trueveyafalseyazdırın) - Daha ucuz olan ürünün adını yazdırın
Örneğin, girdiler Apple, 2, Laptop ve 999 ise çıktı şöyle olmalıdır:
true
false
AppleApple (fiyat 2) Laptop'tan (fiyat 999) daha küçüktür, bu nedenle ilk karşılaştırma true olur. Apple Laptop'tan büyük değildir, bu nedenle ikincisi false olur. Ve Apple daha düşük fiyata sahip olduğu için en ucuz ürün olarak yazdırılır.
Kopya kağıdı
__lt metametodu, özel nesneler için "küçüktür" (<code><) operatörünü işler.
Lua a < b ifadesini değerlendirdiğinde, metatabloda __lt metodunu arar. Bu metametot, karşılaştırma mantığınıza göre true veya false döndürmelidir.
local Item = {}
Item.__index = Item
function Item:new(name, price)
local obj = {name = name, price = price}
setmetatable(obj, Item)
return obj
end
function Item.__lt(a, b)
return a.price < b.price
end__lt tanımlandığında, öğeleri doğrudan karşılaştırabilirsiniz:
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- Çıktı: true
print(laptop < apple) -- Çıktı: falseLua, operatörünü otomatik olarak __lt metodundan türetir. a > b yazdığınızda, Lua bunun yerine b < a ifadesini değerlendirir. Sadece __lt tanımlamak size her iki karşılaştırma yönünü de sağlar.
Kendin dene
-- Product modülünü dahil et
local Product = require('Product')
-- Girdileri oku
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())
-- YAPILACAK: Product:new() kullanarak iki Product örneği oluşturun
-- YAPILACAK: < operatörünü kullanarak ürünleri karşılaştırın ve true/false yazdırın
-- YAPILACAK: > operatörünü kullanarak ürünleri karşılaştırın ve true/false yazdırın
-- YAPILACAK: Daha ucuz olan ürünün adını 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