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
endgetmetatable для определения класса
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 — локальная установка не требуется.
Все уроки этого курса
- Проектирование базового класса и конструктора
- Многоуровневое наследование
- Композиция примесей и проверка интерфейсов
- instanceof и изучение типов