Menu
Coddy logo textTech

Dodawanie obiektów

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

Widziałeś już, jak metody metatablicy, takie jak __tostring i __eq, pozwalają dostosowywać zachowanie obiektów. Teraz rozszerzymy to na operacje arytmetyczne, zaczynając od dodawania.

Metametoda __add określa, co się dzieje, gdy używasz operatora + między dwoma obiektami. Gdy Lua napotka a + b, szuka __add w metatabeli jednego z operandów.

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
    local obj = {x = x, y = y}
    setmetatable(obj, Vector)
    return obj
end

function Vector.__add(v1, v2)
    return Vector:new(v1.x + v2.x, v1.y + v2.y)
end

Zauważ, że __add jest zdefiniowane z kropką, a nie dwukropkiem. Otrzymuje oba operandy jako argumenty i powinno zwracać nowy obiekt, zamiast modyfikować którykolwiek z oryginalnych. Dzięki temu operacja jest przewidywalna i bezpieczna.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- Wynik: 4  6

Kluczowe spostrzeżenie jest takie, że __add musi znajdować się w samej metatabeli (tutaj Vector), a nie tylko w obiekcie. Ponieważ ustawiamy Vector jako metatabelę wszystkich instancji, wszystkie automatycznie współdzielą to zachowanie.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Vector, która obsługuje dodawanie za pomocą operatora +. To Twój pierwszy krok w kierunku przeciążania operatorów, dzięki któremu Twoje obiekty będą naturalnie współpracować z wbudowanymi operatorami Lua.

Rozmieścisz swój kod w dwóch plikach:

  • Vector.lua: Zdefiniuj klasę Vector z komponentami x i y. Dodaj konstruktor :new(x, y) i zaimplementuj metametodę __add, aby dodanie dwóch wektorów tworzyło nowy wektor z połączonymi komponentami. Pamiętaj, że __add używa składni z kropką (a nie dwukropkiem) i otrzymuje oba operandy jako argumenty.
  • main.lua: Załaduj moduł Vector, utwórz instancje wektorów i pokaż, że ich dodanie daje prawidłowy wynik.

Otrzymasz cztery dane wejściowe:

  1. Komponent x pierwszego wektora
  2. Komponent y pierwszego wektora
  3. Komponent x drugiego wektora
  4. Komponent y drugiego wektora

W głównym pliku utwórz dwa wektory z podanymi komponentami, dodaj je do siebie za pomocą operatora + i wypisz wartości x i y wynikowego wektora w osobnych wierszach.

Na przykład, jeśli dane wejściowe to 3, 4, 1, 2, wynik powinien wyglądać tak:

4
6

Pierwszy wektor (3, 4) plus drugi wektor (1, 2) daje nowy wektor (4, 6).

Spróbuj swoich sił

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

-- Odczytaj dane wejściowe
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: Utwórz dwie instancje Vector, używając wartości wejściowych

-- TODO: Dodaj dwa wektory za pomocą operatora +

-- TODO: Wypisz wartości x i y wynikowego wektora 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