Eşitlik Kontrolleri
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 17 / 70.
__tostring'in bir nesnenin kendisini nasıl görüntüleyeceğini nasıl kontrol ettiğini gördünüz. Bir diğer kullanışlı metametot, == operatörünü kullanarak iki nesnenin ne zaman eşit kabul edilmesi gerektiğini tanımlayan __eq metametodudur.
Varsayılan olarak, iki tabloyu == ile karşılaştırmak, bunların bellekteki tam olarak aynı tablo olup olmadıklarını kontrol eder. Aynı verilere sahip iki ayrı nesne false döndürecektir:
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ıf içinde, onu tıpkı __tostring gibi—sınıf tablosunda bir fonksiyon olarak—eklersiniz. Eşitliğin çalışması için her iki nesne de aynı metatabloyu paylaşmalıdır:
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şıyorlarsa 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 desen, nesneler benzersiz tanımlayıcılara sahip gerçek dünya varlıklarını temsil ettiğinde —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— değerlidir.
Görev
Kolayİki ürünün tamamen farklı tablolarda saklansalar bile aynı ürün olup olmadığını belirleyebilen bir Product sınıfı oluşturalım! Perakende sistemlerinde, ürünler genellikle benzersiz SKU kodlarına (Stok Tutma Birimleri) sahiptir ve iki ürün, fiyat değişiklikleri gibi diğer ayrıntılardan bağımsız olarak aynı SKU'yu paylaşıyorlarsa eşit kabul edilmelidir.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Product.lua: Standart prototip modelini kullanarakProductsınıfınızı tanımlayın. Her ürün birsku(benzersiz tanımlayıcı) ve birnamesaklamalıdır. İki ürünün aynı SKU'ya sahip olduklarında eşit kabul edilmesi için__eqmetametodunu uygulayın; eşitlik için ismin bir önemi yoktur.main.lua: Product modülünüzü dahil edin (require) ve birkaç ürün örneği oluşturun. Özel eşitlik mantığınızın işleyişini görmek için bunları==operatörünü kullanarak karşılaştırın.
Product sınıfınız şunları içermelidir:
- Bir
:new(sku, name)yapıcı metodu (constructor) - Şu formatta bir dize döndüren bir
:getInfo()metodu:[sku]: [name] - Ürünleri SKU'larına göre karşılaştıran
__eqmetametodu
Altı adet girdi alacaksınız:
- Birinci ürün için SKU
- Birinci ürün için isim
- İkinci ürün için SKU
- İkinci ürün için isim
- Üçüncü ürün için SKU
- Üçüncü ürün için isim
Ana dosyanızda, sağlanan girdileri kullanarak üç ürün oluşturun ve ardından şunları yazdırın:
- Her ürün için bilgiler (üç satır)
- Ürün 1 ile ürün 2'nin karşılaştırılmasının sonucu
- Ürün 1 ile ürün 3'ün karşılaştırılmasının sonucu
Örneğin, girdiler ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789 ve Keyboard ise çıktı şu şekilde olmalıdır:
ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
falseİsimleri farklı olsa bile ilk iki ürünün nasıl eşit (aynı SKU) olduğuna dikkat edin; gerçek envanter sistemleri, isim değişiklikleri ve güncellemeler boyunca ürünleri tam olarak bu şekilde takip eder!
Kopya kağıdı
__eq metametodu, == operatörünü kullanarak nesneler için özel eşitlik mantığını tanımlar.
Varsayılan olarak, iki tabloyu karşılaştırmak, bunların bellekteki aynı tablo olup olmadığını kontrol eder:
local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2) -- Çıktı: false (farklı tablolar)Özel eşitlik tanımlamak için, sınıf tablosuna bir fonksiyon olarak __eq ekleyin. Her iki nesne de aynı metatabloyu paylaşmalıdır:
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 nesneler, özel mantığınıza göre eşittir:
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)Kendin dene
-- Product modülünü dahil et
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()
-- YAPILACAK: Girdileri kullanarak üç Product örneği oluşturun
-- YAPILACAK: Her ürünün bilgisini yazdırın (üç satır)
-- YAPILACAK: Ürün 1 ile ürün 2'yi karşılaştırmanın sonucunu yazdırın
-- YAPILACAK: Ürün 1 ile ürün 3'ü karşılaştırmanın sonucunu 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