Как понять, что скрипт загружен через require?

Страницы: 1
RSS
Как понять, что скрипт загружен через require?
 
В Lua 5.1 можно было заглянуть в package.loaded[modname].
Если там userdata, то скрипт загружен через require, иначе - запущен сам.
А теперь как?
 
Добрый день.

Через require подтягиваются модули, внешние dll или же обычные Lua модули. Если модуль в таблице package.loaded, значит он загружен.
Не совсем понятно, что именно нужно.
Возможно Вам поможет  вот это описание http://www.lua.org/manual/5.4/manual.html

Раздел 6.3 – Modules

 
Цитата
Egor Zaytsev написал:
что именно нужно
Внутри модуля определить, каким образом он был запущен.
В Lua 5.1 работал такой способ:
Код
if package.loaded[modname] == nil then
  print("Скрипт запущен напрямую")
else
  print("Скрипт загружен через require")
end

В Lua 5.4 внутри самого модуля package.loaded[modname] = nil в любом случае.
 
Добрый день.

Проверили у себя. Такой скрипт работает:



Цитата

if _VERSION == 'Lua 5.3' then

 package.cpath = getScriptPath() .. "\\lib_x64_53\\?.dll;" .. package.cpath

elseif _VERSION == 'Lua 5.4' then

 package.cpath = getScriptPath() .. "\\lib_x64_54\\?.dll;" .. package.cpath

end

package.path = getScriptPath() .. "\\lualib\\?.lua;" .. package.path

dll_module_name = "luasql.odbc"

lua_module_name = "mymodule"

driver = require(dll_module_name)

if package.loaded[dll_module_name] == nil then

message("DLL модуль запущен напрямую " .. _VERSION)

else

 message("DLL модуль загружен через require " .. _VERSION)

end

mymod = require(lua_module_name)

if package.loaded[lua_module_name] == nil then

message("Lua модуль запущен напрямую " .. _VERSION)

else

 message("Lua модуль загружен через require " .. _VERSION)

end

 
Цитата
Незнайка написал:
Внутри модуля определить, каким образом он был запущен.
Вы же смотрите в скрипте, загружающем модуль.
 
Цитата
Незнайка написал:
В Lua 5.1 можно было заглянуть в package.loaded[modname].
Если там userdata, то скрипт загружен через require, иначе - запущен сам.
А теперь как?
Незнайка, вы в скрипте, который может запускать рассматриваемый модуль, поставьте флаг и проверяйте его в модуле. Если модуль флаг не видит, значит он сам запущен, а если видит, то снаружи.
 
При загрузке скрипта как модуля, в него первым аргументом передаётся название модуля. Функция 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' )
Страницы: 1
Читают тему (гостей: 1)
Наверх