Eşitlik Kontrolleri
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 17 / 70.
Bir nesnenin kendisini nasıl görüntülediğini __tostring öğesinin nasıl kontrol ettiğini gördün. Bir diğer kullanışlı metamethod, == operatörü kullanılarak iki nesnenin ne zaman eşit kabul edilmesi gerektiğini tanımlayan __eq öğesidir.
Varsayılan olarak, iki tabloyu == ile karşılaştırmak, bellekte tam olarak aynı tablo olup olmadıklarını denetler. Aynı verilere sahip iki ayrı nesne false döndürür:
local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2) -- Çıktı: false (farklı tablolar)__eq ile kendi eşitlik mantığınızı tanımlayabilirsiniz. Bir sınıfta, tıpkı __tostring gibi, bunu sınıf tablosuna bir işlev olarak eklersiniz. Eşitliğin çalışması için her iki nesnenin de aynı metatabloyu paylaşması gerekir:
local User = {}
User.__index = User
function User:new(id, name)
local instance = {}
setmetatable(instance, self)
instance.id = id
instance.name = name
return instance
end
function User:__eq(other)
return self.id == other.id
endArtık iki User nesnesi, diğer alanlardan bağımsız olarak aynı ID’yi paylaşıyorsa eşit kabul edilir:
local u1 = User:new(101, "Alice")
local u2 = User:new(101, "Bob")
local u3 = User:new(202, "Alice")
print(u1 == u2) -- Çıktı: true (aynı ID)
print(u1 == u3) -- Çıktı: false (farklı ID'ler)Bu pattern, nesnelerin benzersiz tanımlayıcılara sahip gerçek dünyadaki varlıkları temsil ettiği durumlarda değerlidir: veritabanı kayıtlarını, oyun varlıklarını veya kimliğin bellek konumundan daha önemli olduğu herhangi bir nesneyi karşılaştırırken.
Görev
Kolayİki ürün tamamen farklı tablolarda saklansa bile aynı ürün olup olmadığını belirleyebilen bir Product sınıfı oluşturalım! Perakende sistemlerinde ürünlerin genellikle benzersiz SKU kodları (Stok Tutma Birimleri) vardır ve diğer ayrıntılar (fiyat değişiklikleri gibi) ne olursa olsun, iki ürün aynı SKU'yu paylaşıyorsa eşit kabul edilmelidir.
Kodunu iki dosya arasında düzenleyeceksin:
Product.lua: Standart prototip kalıbıylaProductsınıfını tanımla. Her ürün birsku(benzersiz tanımlayıcı) ve birnamesaklamalıdır. İki ürün aynı SKU'ya sahip olduğunda eşit kabul edilecek şekilde__eqmetamethod'unu uygula: eşitlik açısından adın önemi yoktur.main.lua: Product modülünü içe aktar ve birkaç ürün örneği oluştur. Özel eşitlik mantığını uygulamada görmek için bunları==operatörünü kullanarak karşılaştır.
Product sınıfın şunları içermelidir:
- Bir
:new(sku, name)oluşturucusu :getInfo()biçiminde bir dize döndüren bir[sku]: [name]metodu- Ürünleri SKU'larına göre karşılaştıran
__eqmetamethod'u
Altı girdi alacaksın:
- İlk ürünün SKU'su
- İlk ürünün adı
- İkinci ürünün SKU'su
- İkinci ürünün adı
- Üçüncü ürünün SKU'su
- Üçüncü ürünün adı
Ana dosyanda, verilen girdileri kullanarak üç ürün oluştur, ardından şunları yazdır:
- Her ürünün bilgileri (üç satır)
- 1. ürün ile 2. ürünün karşılaştırılmasının sonucu
- 1. ürün ile 3. ürünün karşılaştırılmasının sonucu
Örneğin girdiler ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789 ve Keyboard ise çıktı şöyle olmalıdır:
ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
falseİlk iki ürünün adları farklı olsa da (aynı SKU'ya sahip oldukları için) eşit olduklarına dikkat et. Gerçek envanter sistemleri ürünleri ad değişiklikleri ve güncellemeler boyunca tam olarak bu şekilde takip eder!
Kendin dene
-- Product modülünü yükle
local Product = require('Product')
-- Girdileri oku
local sku1 = io.read()
local name1 = io.read()
local sku2 = io.read()
local name2 = io.read()
local sku3 = io.read()
local name3 = io.read()
-- TODO: Girdileri kullanarak üç Product örneği oluştur
-- TODO: Her ürün için bilgiyi yazdır (üç satır)
-- TODO: Ürün 1 ile ürün 2'yi karşılaştırma sonucunu yazdır
-- TODO: Ürün 1 ile ürün 3'ü karşılaştırma sonucunu yazdır
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