Я ищу библиотеку/функцию в lua, которая позволяет создавать пользовательские типы переменных (даже если вы определяете свой тип, используя метод типа). Я пытаюсь сделать кодировщик/декодер json, который имеет настраиваемый тип «json». Я хочу решение, которое можно выполнить только в lua.Пользовательские типы переменных Lua
ответ
Вы не можете создавать новые типы Lua, но вы можете имитировать их создание в значительной степени с использованием метаданных и таблиц. Например:
local frobnicator_metatable = {}
frobnicator_metatable.__index = frobnicator_metatable
function frobnicator_metatable.ToString(self)
return "Frobnicator object\n"
.. " field1 = " .. tostring(self.field1) .. "\n"
.. " field2 = " .. tostring(self.field2)
end
local function NewFrobnicator(arg1, arg2)
local obj = { field1 = arg1, field2 = arg2 }
return setmetatable(obj, frobnicator_metatable)
end
local original_type = type -- saves `type` function
-- monkey patch type function
type = function(obj)
local otype = original_type(obj)
if otype == "table" and getmetatable(obj) == frobnicator_metatable then
return "frobnicator"
end
return otype
end
local x = NewFrobnicator()
local y = NewFrobnicator(1, "hello")
print(x)
print(y)
print("----")
print("The type of x is: " .. type(x))
print("The type of y is: " .. type(y))
print("----")
print(x:ToString())
print(y:ToString())
print("----")
print(type("hello!")) -- just to see it works as usual
print(type({})) -- just to see it works as usual
Выхода:
table: 004649D0 table: 004649F8 ---- The type of x is: frobnicator The type of y is: frobnicator ---- Frobnicator object field1 = nil field2 = nil Frobnicator object field1 = 1 field2 = hello ---- string table
Конечно пример является упрощенным и есть больше вещей, чтобы сказать об объектно-ориентированном программировании в Lua. Вы можете найти следующие полезные ссылки:
- Lua WIKI OOP index page.
- Lua WIKI page: Object Orientation Tutorial.
- Chapter on OOP of Programming in Lua. Это первое книжное издание, поэтому оно ориентировано на Lua 5.0, но основной материал по-прежнему применяется.
То, о чем вы просите, невозможно, даже с C API. В Lua просто встроены только встроенные типы, нет возможности добавить больше. Однако, используя метаметоды и таблицы, вы можете создавать (функции создания) таблицы, которые приходят очень рядом с пользовательскими типами/классами на других языках. См. Например, Programming in Lua: Object-Oriented Programming (но имейте в виду, что книга была написана для Lua 5.0, поэтому некоторые детали могли быть изменены).
- 1. C API и Lua типы
- 2. Пользовательские типы данных
- 3. lua - присвоение переменных присвоений
- 4. Манипулирование переменных Lua из C
- 5. wp_query пользовательские типы сообщений
- 6. Scheme - Пользовательские типы данных?
- 7. Определить пользовательские типы данных
- 8. Упругие пользовательские типы поданных
- 9. Postgres hashing пользовательские типы
- 10. Пользовательские типы данных Сжатие
- 11. WCF, возвращающий пользовательские типы
- 12. Пользовательские типы сообщений
- 13. Добавить пользовательские типы претензий
- 14. C пользовательские типы данных
- 15. Пользовательские типы в Elixir
- 16. VSX: Пользовательские типы проектов
- 17. mapreduce --- пользовательские типы данных
- 18. Conky - Lua Config - Пользовательские переменные
- 19. Lua: вывоз мусора + пользовательские данные
- 20. Пользовательские типы Joomla/пользовательские поля без плагина?
- 21. Типы переменных в CoffeeScript
- 22. Хранить различные типы переменных
- 23. Типы переменных Javascript
- 24. Типы переменных Python
- 25. Общие типы переменных типа?
- 26. типы переменных в java
- 27. Активность Android Типы переменных
- 28. типы переменных в окнах
- 29. Типы инициализации переменных Javascript
- 30. Lua LÖVE автоматизирует имена переменных
Для вашей функции type() здесь то, что я обычно делаю, это реализовать поле __type в метатете, которое описывает имя класса. Тогда тип всегда будет полезным значением для всех классов. – Zeksie
@ Zeksie Да, это определенно вариант. Как я уже сказал, говорить о ООП в Луа гораздо больше. –
Не могли бы вы создать функцию, которая создавала бы пользовательский тип переменной? Например: 'jsonCode = {" json text here "} varType (jsonCode," json ")' будет возвращать просто 'jsonCode' с пользовательским типом' 'json''. 'tostring (jsonCode)' просто вернет 'jsonCode [1]' (который в этом случае будет равен «json text здесь»). Не утруждайте себя внедрением 2-значной системы, которую вы здесь, я буду использовать ее только с таблицей, имеющей 1 значение. – tupperkion