«Отражение» не совсем вещь в Lua, не в Java-смысле этого термина.В качестве языка, который использует Duck Typing , все очень открыто.Lua имеет только одну структуру данных: таблицу. Все в Lua происходит из таблиц.Модуль - это просто таблица, возвращаемая чанком, загруженным require
.
. Содержимое и структуры данных за таблицей могут быть скрыты через метатаблицы, которые можно использовать для предотвращения обычного процесса итерации (pairs
, ipairs
и т. Д.) Для доступа к элементам в таблице.Тем не менее, вы всегда можете использовать getmetatable
, чтобы извлечь сам метатабель и вызвать его;Вы можете даже прорваться через обычный способ скрыть метатаблицу с помощью debug.getmetatable
.
При этом, поскольку Lua полагается на Duck Typing, а API-интерфейсы Lua довольно открыты, довольно трудно быть подробный об упаковке каждой отдельной функции и таблицы.
Например, допустим, вы хотите обернуть модуль.Это достаточно просто;просто создайте пустую таблицу, в которой есть метатаблица, метаметоды которой вызывают методы упакованного модуля.Это работает для прямых API модуля.
Но что произойдет, если один из этих API возвратит объект, который сам должен быть упакован?Как вы сможете отличить специализированный объект API от обычной таблицы?Не менее важно, если вы можете успешно определить, какие возвращаемые значения нужно переносить, как вы это сделаете?В конце концов, если они передают одну из ваших таблиц-оболочек в API-функцию-оболочку, теперь ей нужно развернуть эту таблицу, чтобы она могла передать упакованную таблицу фактической функции-оболочке.