Menu
Coddy logo textTech

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
end

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

challenge icon

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ıyla Product sınıfını tanımla. Her ürün bir sku (benzersiz tanımlayıcı) ve bir name saklamalıdır. İki ürün aynı SKU'ya sahip olduğunda eşit kabul edilecek şekilde __eq metamethod'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 __eq metamethod'u

Altı girdi alacaksın:

  1. İlk ürünün SKU'su
  2. İlk ürünün adı
  3. İkinci ürünün SKU'su
  4. İkinci ürünün adı
  5. Üçüncü ürünün SKU'su
  6. Üçüncü ürünün adı

Ana dosyanda, verilen girdileri kullanarak üç ürün oluştur, ardından şunları yazdır:

  1. Her ürünün bilgileri (üç satır)
  2. 1. ürün ile 2. ürünün karşılaştırılmasının sonucu
  3. 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
quiz iconKendini test et

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

Kendi başına pratik yap: Online Lua derleyicisi