Menu
Coddy logo textTech

Геттеры

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 13 из 70.

Вы научились хранить данные в переменных экземпляра, таких как self.health или self.items. Хотя вы можете обращаться к этим полям непосредственно извне объекта, существует более чистый подход: using методы-геттеры.

Геттер (также называемый методом-аксессором) — это простой method, который возвращает внутреннее значение. Вместо прямого обращения к player.health вы вызываете player:getHealth():

local Player = {}
Player.__index = Player

function Player:new(name)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.health = 100
    return instance
end

function Player:getHealth()
    return self.health
end

function Player:getName()
    return self.name
end

Зачем нужен дополнительный method? Геттеры обеспечивают контролируемую точку доступа к вашим данным.

Сейчас :getHealth() просто возвращает значение. Но позже ты можешь захотеть добавить логику: например, возвращать "Critical", если health падает ниже 10, или записывать в журнал каждый раз, когда проверяется health.

Имея getter, вы можете вносить эти изменения, не изменяя код, который использует объект.

local hero = Player:new("Luna")
print(hero:getHealth())  -- Вывод: 100
print(hero:getName())    -- Вывод: Luna

Этот pattern создаёт чёткую границу между внутренней структурой объекта и тем, как другой код взаимодействует с ним. Внешний мир запрашивает data через method, а не обращается напрямую к полям объекта.

challenge icon

Задание

Легко

Давайте создадим Player class, который использует getter method для доступа к своим внутренним данным. Вместо прямого обращения к полям player вы создадите method, которые обеспечивают контролируемый доступ к информации о player.

Вы организуете свой код в двух файлах:

  • Player.lua: Define свой Player class, используя стандартный prototype pattern. Constructor должен принимать имя и Initialize health значением 100. Добавьте три getter method:
    • :getName() returns имя player
    • :getHealth() returns текущий health player
    • :getStatus() returns форматированную строку, объединяющую обе части информации
  • main.lua: Require свой Player module и создайте instance player. Используйте getter method для отображения информации о player: получайте всё через method, а не читая поля напрямую.

Ваш :getStatus() method должен return строку в этом точном формате:

[name] has [health] HP

Вы получите один input: имя player.

В своём главном файле создайте player с given именем, затем выведите три строки, используя свои getter method:

  1. Имя player (с использованием :getName())
  2. Health player (с использованием :getHealth())
  3. Полный status player (с использованием :getStatus())

Например, если input — Luna, Output должен быть таким:

Luna
100
Luna has 100 HP
ТРЕБУЕМЫЙ ФОРМАТ ВЫВОДА: [Ваш переведённый контент здесь]

Попробуйте сами

-- Подключить модуль Player
local Player = require('Player')

-- Прочитать ввод
local name = io.read()

-- TODO: Создать экземпляр игрока с заданным именем

-- TODO: Вывести имя игрока, используя :getName()

-- TODO: Вывести здоровье игрока, используя :getHealth()

-- TODO: Вывести статус игрока, используя :getStatus()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua