Menu
Coddy logo textTech

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łowych zakresów (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 z kropką (nie dwukropkiem), ponieważ 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 z różnicami poszczególnych 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 poszczególnych 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 głównym pliku 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 dane wejściowe to 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 o podanych wartościach 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