Menu
Coddy logo textTech

Inicialización de atributos

Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 9 de 70.

El constructor :new() que aprendiste crea objetos, pero cada instancia comienza siendo idéntica. Los objetos reales necesitan datos únicos: una persona tiene un nombre específico, un jugador tiene una puntuación inicial. Para que los objetos sean útiles, el constructor debe aceptar argumentos y asignarlos a la nueva instancia.

Aquí se explica cómo expandir el constructor para aceptar valores iniciales:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

El constructor ahora toma name y breed como parámetros. Después de crear la instancia vacía y establecer su metatable, asignamos estos valores directamente a los campos de la instancia. Cada objeto creado tendrá su propio name y breed.

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- Salida: Soy Rex, un Pastor Alemán
dog2:introduce()  -- Salida: Soy Bella, un Caniche

Ambos perros comparten el mismo método :introduce() del prototipo, pero cada uno tiene su propio nombre y raza únicos almacenados en su tabla de instancia. Este es el poder de combinar prototipos con constructores parametrizados: comportamiento compartido con estado individual.

challenge icon

Desafío

Fácil

Vamos a construir una clase Person que cree individuos únicos con sus propios nombres y edades. Organizarás tu código en dos archivos para practicar la estructura adecuada de módulos.

Crearás:

  • Person.lua: Define tu clase Person con un constructor que acepte un nombre y una edad. Incluye un método :introduce() que permita a cada persona presentarse.
  • main.lua: Requiere tu módulo Person y crea una instancia de persona utilizando las entradas proporcionadas. Luego, haz que se presente.

Tu constructor :new(name, age) debe aceptar ambos valores y almacenarlos en la nueva instancia. El método :introduce() debe imprimir en este formato exacto:

Hello, my name is [name] and I am [age] years old

Recibirás dos entradas:

  1. El nombre de la persona
  2. La edad de la persona

Por ejemplo, si las entradas son Alice y 25, la salida debe ser:

Hello, my name is Alice and I am 25 years old

Hoja de referencia

Para crear objetos con datos únicos, expande el constructor :new() para que acepte parámetros y los asigne a la instancia:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

Crea instancias con diferentes valores:

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- Salida: I am Rex, a German Shepherd
dog2:introduce()  -- Salida: I am Bella, a Poodle

Cada objeto tiene sus propios datos únicos almacenados en su tabla de instancia, mientras comparte métodos del prototipo.

Pruébalo tú mismo

-- Requerir el módulo Person
local Person = require('Person')

-- Leer entrada
local name = io.read()
local age = io.read()

-- TODO: Crear una nueva instancia de Person usando Person:new(name, age)

-- TODO: Llamar al método introduce() en tu instancia de person
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming