Menu
Coddy logo textTech

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
end

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

challenge icon

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 kullanarak Product sınıfınızı tanımlayın. Her ürün bir sku (benzersiz tanımlayıcı) ve bir name saklamalıdır. İki ürünün aynı SKU'ya sahip olduklarında eşit kabul edilmesi için __eq metametodunu 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 __eq metametodu

Altı adet girdi alacaksınız:

  1. Birinci ürün için SKU
  2. Birinci ürün için isim
  3. İkinci ürün için SKU
  4. İkinci ürün için isim
  5. Üçüncü ürün için SKU
  6. Üçüncü ürün için isim

Ana dosyanızda, sağlanan girdileri kullanarak üç ürün oluşturun ve ardından şunları yazdırın:

  1. Her ürün için bilgiler (üç satır)
  2. Ürün 1 ile ürün 2'nin karşılaştırılmasının sonucu
  3. Ü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
end

Artı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
quiz iconKendini test et

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