При загрузке скрипта как модуля, в него первым аргументом передаётся название модуля. Функция loadfile загружает файл в виде метода, который можно выполнить с аргументами. Функция dofile автоматически исполняет файл без аргументов. Таким способом можно отличить метод загрузки.
| Код | 
|---|
require ( 'test' ) ( 'require' )
loadfile ( 'test.lua' )( 'foo' )( 'loadfile' )dofile ( 'test.lua' ) ( 'dofile' )
  | 
test.lua
| Код | 
|---|
local args = { ... or 'no arguments' }
for k, v in pairs ( args ) do print ( k, v ) end
return function ( s ) print ( s ) end | 
вывод:
| Код | 
|---|
1   test
require
1   foo
loadfile
1   no arguments
dofile
  | 
Всегда загружайте скрипты как модули, то есть с помощью функции require. Это исключает повторное исполнение кода в файле и перезапись измененных значений на исходные. Обратите внимание, что require не принимает путь к файлу, а только название модуля. Точка и расширение файла не указываются (можно таже загрузить совместимые .dll и .so) и если модуль расположен внутри папки, то разделителем нужно использовать точку а не слэш.
| Код | 
|---|
--/module/interpreted.lua
--/module/HWaccelerated.dll
require ( 'module.interpreted' )
require ( 'module.HWaccelerated' )
  |