Menu
CoddyTech

Somando Objetos

Parte da seção Programação orientada a objetos do Journey de Lua da Coddy. Lição 26 de 70.

Você já viu como metamétodos como __tostring e __eq permitem personalizar o comportamento dos objetos. Agora vamos estender isso às operações aritméticas, começando pela adição.

O metamétodo __add define o que acontece quando você usa o operador + entre dois objetos. Quando Lua encontra a + b, ele procura por __add na metatable de qualquer um dos operandos.

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

Observe que __add é definido com ponto. Lua passa os dois operandos como argumentos simples, e a forma com ponto nomeia ambos. A forma com dois-pontos também funcionaria, já que function Vector:__add(other) é igual a function Vector.__add(self, other), mas a forma com ponto é a convenção. __add deve retornar um novo objeto em vez de modificar qualquer um dos originais. Isso mantém a operação previsível e segura.

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

print(c.x, c.y)  -- Saída: 4  6

A principal percepção é que __add precisa estar na própria metatable (aqui, Vector), não apenas no objeto. Como definimos Vector como a metatable de todas as instâncias, todas elas compartilham esse comportamento automaticamente.

challenge icon

Desafio

Fácil

Vamos criar uma classe Vector que permita a adição usando o operador +. Este é seu primeiro passo no uso da sobrecarga de operadores, fazendo com que seus objetos funcionem naturalmente com os operadores integrados do Lua.

Você organizará seu código em dois arquivos:

  • Vector.lua: Defina sua classe Vector com os componentes x e y. Inclua um construtor :new(x, y) e implemente o metamétodo __add para que a adição de dois vetores crie um novo vetor com os componentes somados. Defina __add com ponto, para que ambos os operandos sejam recebidos como argumentos nomeados.
  • main.lua: Importe seu módulo Vector, crie instâncias de vetores e demonstre que a adição deles produz o resultado correto.

Você receberá quatro entradas:

  1. Componente x do primeiro vetor
  2. Componente y do primeiro vetor
  3. Componente x do segundo vetor
  4. Componente y do segundo vetor

No arquivo principal, crie dois vetores com os componentes fornecidos, some-os usando o operador + e imprima os valores x e y do vetor resultante em linhas separadas.

Por exemplo, se as entradas forem 3, 4, 1, 2, a saída deverá ser:

4
6

O primeiro vetor (3, 4) mais o segundo vetor (1, 2) é igual a um novo vetor (4, 6).

Experimente você mesmo

-- Carregue o módulo Vector
local Vector = require('Vector')

-- Leia a entrada
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: Crie duas instâncias de Vector usando os valores de entrada

-- TODO: Some os dois vetores usando o operador +

-- TODO: Imprima os valores x e y do vetor resultante em linhas separadas
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de Lua online