0Pricing
Lua Academy · Урок

instanceof и изучение типов

Реализуйте проверки instanceof(), проходя по иерархии классов.

«instanceof и изучение типов» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Что такое instanceof?

instanceof(obj, Class) проверяет, является ли объект экземпляром определённого класса или любого из его предков. В объектно-ориентированных системах эта функция заменяет обычный type() Lua.

Простой instanceof

Пройдите по цепочке метатаблиц от экземпляра вверх, проверяя наличие целевого класса.

local function instanceof(obj, cls)
  if type(obj) ~= "table" then return false end
  local mt = getmetatable(obj)
  while mt do
    if mt == cls then return true end
    local parent = getmetatable(mt)
    mt = parent and parent.__index
  end
  return false
end

Проверка instanceof

Корректно работает с цепочками наследования.

local cat = Animal:new("Cat","Meow")
local rex = Dog:new("Rex")
print(instanceof(rex, Dog))     -- true
print(instanceof(rex, Animal))  -- true
print(instanceof(cat, Dog))     -- false

Соглашение об использовании поля __type

Храните строковое имя типа в каждом классе для быстрой проверки типа во время выполнения.

Animal.__type = "Animal"
Dog.__type = "Dog"
local function typeOf(obj)
  local mt = getmetatable(obj)
  return mt and mt.__type or type(obj)
end
print(typeOf(rex))  -- Dog

Проверки типов

Создавайте функции проверки типов для более ясных утверждений на границах API.

local function assertType(obj, cls, argName)
  if not instanceof(obj, cls) then
    error(("Expected %s for %s, got %s"):format(
      cls.__name, argName, typeOf(obj)), 2)
  end
end

getmetatable для определения класса

getmetatable(obj) возвращает таблицу класса. Сравните её с известным классом, чтобы проверить точный тип без учёта наследования.

local function exactType(obj)
  return getmetatable(obj)
end
print(exactType(rex) == Dog)  -- true
print(exactType(rex) == Animal)  -- false (not exact)

Исследование иерархии классов

Пройдите по цепочке метатаблиц, чтобы перечислить все классы, от которых наследуется объект.

local function classChain(obj)
  local chain = {}
  local mt = getmetatable(obj)
  while mt do
    chain[#chain+1] = mt.__name or "?"
    local parent = getmetatable(mt)
    mt = parent and parent.__index
  end
  return chain
end

Сравнение систем типов

Встроенная функция type() Lua возвращает только 8 базовых типов. В объектно-ориентированных системах используйте instanceof или собственные функции typeOf, учитывающие иерархию классов.

Запечатанные классы

Запретите создание подклассов, удалив метод :extend() из класса или добавив проверку в __index.

Диспетчеризация по типу

Выбирайте функцию для вызова на основе типа во время выполнения — это лёгкая альтернатива перегрузке методов.

local function process(animal)
  if instanceof(animal, Dog) then
    print("Processing Dog:", animal.name)
  elseif instanceof(animal, Animal) then
    print("Processing Animal:", animal.name)
  end
end

Отладка с информацией о типе

Добавьте в классы __tostring, включающий имя типа, чтобы получать информативный отладочный вывод.

Вопрос об instanceof

Что возвращает instanceof(rex, Animal), если Rex является Dog, который расширяет Animal?

Повторение: instanceof и исследование типов

instanceof проходит по цепочке метатаблиц, проверяя тип с учётом наследования. Используйте поля __type для быстрого поиска типа по строке. Проверки типов на границах API заранее обнаруживают ошибки типов и выдают понятные сообщения.

Часто задаваемые вопросы

Урок «instanceof и изучение типов» бесплатный?

Да — полный текст урока «instanceof и изучение типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «instanceof и изучение типов»?

Реализуйте проверки instanceof(), проходя по иерархии классов. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «instanceof и изучение типов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проектирование базового класса и конструктора
  2. Многоуровневое наследование
  3. Композиция примесей и проверка интерфейсов
  4. instanceof и изучение типов
← Назад к Lua Academy