Я тут занялся переписывать в очередной раз свою игру. Решил структуризировать всё по блокам и прогружать их поочередно через require. А для дебага выкладывать при этом инфу о том что прогружаю в консоль. (движок love2d) Чтобы в случае чего понимать на каком этапе, в каком блоке у меня возникли ошибки. Да и просто мне интересны такие мелочи.
В общем к сути проблемы, я хотел написать так:
require = function(path)
print(path)
require(path)
end
Вспомнил, что lua достаточно лояльный язык программирования, позволяет выражения по типу
x, y = y, x
Или
x = x + 1
Поэтому я подумал, что и тут глобальная функция будет просто переназначена. Но в итоге при первом вызове require, функция была зациклена, а точнее вошла в рекурсию.
Я понимал, что в lua переменная require - только ссылка на функцию. И решение пришло очень быстро, переместить временно ссылку на функцию в новую переменную, которая будет вскоре после создания нужной нам функции удалена.
Вышло вот как:
do
local r = require
require = function(path)
print(path)
r(path)
end
end
Да, проблема была решена и очень быстро. Но вот вопрос о том, почему появилась рекурсия для меня всё ещё не ясен. Видимо не достаточно хорошо знаю lua. Прошу объяснить, как такое могло получится.
Вопросы, которые я хочу здесь обсудить:
Почему первый вариант оказался не правильным и как шаг за шагом действовал интерпретатор при таком варианте кода
Какие ещё способы прогрузки кода из файлов есть? Я слышал кажется про функцию load(). Если есть альтернатива require, какие с ней отличия? Работают ли там локальные переменные созданные из основного файла, откуда была вызывана функция?
В чём различия глобальной переменной от локальной? (я много работал с локальными переменными, но глобальные для меня стали просто чем-то неизведанным и страшным, куда я боюсь лесть. Хотя минусы функции require заставляют отказаться от локальных переменных и перейти на глобальные)
Заранее спасибо за ответы. Благодаря форуму и его обитателям, я подтянул свои знания в lua с уровня быдлокодера, до написания читаемого кода.
Я тут занялся переписывать в очередной раз свою игру. Решил структуризировать всё по блокам и прогружать их поочередно через require. А для дебага выкладывать при этом инфу о том что прогружаю в консоль. (движок love2d) Чтобы в случае чего понимать на каком этапе, в каком блоке у меня возникли ошибки. Да и просто мне интересны такие мелочи.
В общем к сути проблемы, я хотел написать так:
Вспомнил, что lua достаточно лояльный язык программирования, позволяет выражения по типу
Или
Поэтому я подумал, что и тут глобальная функция будет просто переназначена. Но в итоге при первом вызове require, функция была зациклена, а точнее вошла в рекурсию.
Я понимал, что в lua переменная require - только ссылка на функцию. И решение пришло очень быстро, переместить временно ссылку на функцию в новую переменную, которая будет вскоре после создания нужной нам функции удалена.
Вышло вот как:
Да, проблема была решена и очень быстро. Но вот вопрос о том, почему появилась рекурсия для меня всё ещё не ясен. Видимо не достаточно хорошо знаю lua. Прошу объяснить, как такое могло получится.
Вопросы, которые я хочу здесь обсудить:
Заранее спасибо за ответы. Благодаря форуму и его обитателям, я подтянул свои знания в lua с уровня быдлокодера, до написания читаемого кода.
Изменено пользователем qwertyMANПоделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах