Menu
CoddyTech

Odejmowanie obiektów

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 27 z 70.

Tak jak __add obsługuje operator +, metametoda __sub definiuje działanie operatora -. Wzorzec jest identyczny. Definiujesz funkcję, która przyjmuje dwa operandy i zwraca nowy obiekt.

local Color = {}
Color.__index = Color

function Color:new(r, g, b)
    local obj = {r = r, g = g, b = b}
    setmetatable(obj, Color)
    return obj
end

function Color.__sub(c1, c2)
    return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end

Podczas pracy z kolorami RGB odejmowanie może dawać wartości ujemne. W rzeczywistych aplikacjach możesz chcieć ograniczać wyniki do prawidłowego zakresu (0-255), ale podstawowa struktura metametody pozostaje taka sama.

local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim

print(result.r, result.g, result.b)  -- Wynik: 150  120  80

Pamiętaj: zdefiniuj __sub za pomocą kropki (nie dwukropka), ponieważ jest to metametoda, którą Lua wywołuje bezpośrednio, przekazując oba operandy jako argumenty.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Color, która obsługuje odejmowanie za pomocą operatora -. Kolory są reprezentowane przez wartości RGB, a odjęcie jednego koloru od drugiego tworzy nowy kolor, którego składowe są różnicami odpowiednich składowych.

Podzielisz swój kod na dwa pliki:

  • Color.lua: Zdefiniuj klasę Color ze składowymi r, g i b, reprezentującymi wartości czerwieni, zieleni i błękitu. Dodaj konstruktor :new(r, g, b) i zaimplementuj metametodę __sub, aby odejmowanie dwóch kolorów tworzyło nowy kolor z różnicami odpowiednich składowych. Pamiętaj, że __sub używa składni z kropką i otrzymuje oba operandy jako argumenty.
  • main.lua: Załaduj moduł Color, utwórz instancje kolorów na podstawie podanych danych wejściowych, odejmij je od siebie i wyświetl wynikowe wartości RGB.

Otrzymasz sześć danych wejściowych:

  1. Składowa czerwieni pierwszego koloru
  2. Składowa zieleni pierwszego koloru
  3. Składowa błękitu pierwszego koloru
  4. Składowa czerwieni drugiego koloru
  5. Składowa zieleni drugiego koloru
  6. Składowa błękitu drugiego koloru

W pliku głównym utwórz dwa kolory z podanych wartości RGB, odejmij drugi kolor od pierwszego za pomocą operatora - i wypisz wartości r, g i b wynikowego koloru w osobnych wierszach.

Na przykład, jeśli danymi wejściowymi są 200, 150, 100, 50, 30, 20, wynikiem powinno być:

150
120
80

Pierwszy kolor (200, 150, 100) minus drugi kolor (50, 30, 20) daje nowy kolor (150, 120, 80).

Spróbuj swoich sił

-- Załaduj moduł Color
local Color = require('Color')

-- Odczytaj wartości wejściowe
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())

-- TODO: Utwórz dwie instancje Color z podanymi wartościami RGB

-- TODO: Odejmij drugi kolor od pierwszego za pomocą operatora -

-- TODO: Wypisz wartości r, g i b wynikowego koloru w osobnych wierszach
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online