Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Fiyata 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: name ve price alanları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 __lt metametodunu uygulayın. __lt tanımlamanın size otomatik olarak operatö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:

  1. Birinci ürünün adı
  2. Birinci ürünün fiyatı
  3. İkinci ürünün adı
  4. İ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:

  1. Birinci ürün ikinciden küçük mü? (true veya false yazdırın)
  2. Birinci ürün ikinciden büyük mü? (true veya false yazdırın)
  3. 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
Apple

Apple (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ı: false

Lua, 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
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