Lua: проблемы с локальным var = require(my lib")

Возможный дубликат:
Зачем делать глобальные функции Lua локальными?

Во многих lua-скриптах от сообщества я вижу что-то вроде добавления модуля в скрипт:

local module = require("module")

Но согласно руководству по lua, это не тот способ загрузки модулей. Сами модули имеют свое имя модуля внутри, так что

require("module")

достаточно использовать модуль следующим образом: module.myfunction(). Первый пример с локальным определением просто записывает "true" в переменную модуля, указывая на то, что модуль успешно загружен.

Странно то, что я вижу такую ​​загрузку "local module = require("module")" везде в сети. Большинство скриптов из lua-сообщества у меня не работают из-за этой ошибки. Мне также интересно, почему я еще не нашел никаких проблем по этому поводу в Интернете.

Следующее, что даже загрузка модулей иногда приводит к странным ошибкам. Например: у меня есть скрипт с

require("purexml.lua")

чем я получил эту ошибку:

no field package.preload['purexml.lua']
no file './purexml/lua.lua'
no file '/usr/local/share/lua/5.1/purexml/lua.lua'
no file '/usr/local/share/lua/5.1/purexml/lua/init.lua'
no file '/usr/local/lib/lua/5.1/purexml/lua.lua'
no file '/usr/local/lib/lua/5.1/purexml/lua/init.lua'
no file './purexml/lua.so'
no file '/usr/local/lib/lua/5.1/purexml/lua.so'
no file '/usr/local/lib/lua/5.1/loadall.so'
no file './purexml.so'
no file '/usr/local/lib/lua/5.1/purexml.so'
no file '/usr/local/lib/lua/5.1/loadall.so'

Но это работает нормально:

require("purexml")

Я пропустил что-то действительно очевидное здесь? Кстати, я использую Lua 5.1.4...


person nodepond    schedule 29.09.2012    source источник
comment
@Nicol Не совсем тот же вопрос. В частности, потому что Lua 5.2 теперь требует локальной ссылки на модуль.   -  person prapin    schedule 29.09.2012
comment
@prapin: Нет, не так. 5.2, как и 5.1, не предъявляет особых требований к тому, что делают модули. Если вы хотите вставить вещи в глобальную таблицу в модуль, вы можете это сделать. Это не рекомендуется, но вы можете это сделать. Действительно, хотя функция module устарела, она все еще существует и может использоваться.   -  person Nicol Bolas    schedule 29.09.2012
comment
Честно говоря... почему этот вопрос был закрыт? Это не дубликат указанного вопроса...   -  person nodepond    schedule 30.09.2012
comment
Удар. Я прыгну на кучу. Кто-нибудь, пожалуйста, модерируйте это и удалите дубликаты в заголовке, возможный дубликат заголовка и т. д. require/module — это совершенно другая проблема.   -  person Celess    schedule 19.03.2013
comment
Хорошо, я попытался развернуть его, отредактировав, но мне отказали в получении очков за дневную команду. Я говорю это, конечно, со всей любовью в мире. :)   -  person Celess    schedule 19.03.2013


Ответы (2)


local module = require("module") создает локальную переменную, содержащую модуль, в дополнение к глобальной по умолчанию (конечно, локальная перекрывает глобальную). Locals намного быстрее в Lua для доступа, поэтому производительность, скорее всего, является причиной, по которой это используется.

И ошибка, которую вы получаете, очевидна, вы не должны добавлять расширение файла при загрузке модулей.

person orlp    schedule 29.09.2012
comment
Но почему-то нет. Я получаю только логическую переменную, возвращаемую из require (module). Пример: local xml = require(purexml) print (xml) -> true И затем, когда я пытаюсь: xml:collect() Консоль говорит: попытаться проиндексировать локальный 'xml' (логическое значение) (по-прежнему используется Lua 5.1.4 ) - person nodepond; 29.09.2012
comment
А, кажется, я понял!! Поймите модуль (..., package.seeall) или альтернативный способ, например, локальный M = {} - общедоступный интерфейс в файле модуля с возвратом M в конце. Внимательно прочтите этот файл: lua-users.org/wiki/ModuleDefinition - person nodepond; 29.09.2012
comment
Это не связано с производительностью. Использование локальных переменных вместо установки вещей в глобальном пространстве — это способ структурировать код, чтобы он преподносил меньше сюрпризов. К сожалению, не все lua-библиотеки следуют этому соглашению. - person kikito; 30.09.2012

В Lua 5.2 модули с хорошим поведением больше не экспортируют глобальную переменную, как в Lua 5.1.

В дополнение к увеличению скорости, обеспечиваемому переменной local, использование local module = require "module" должно использоваться для совместимости с новейшей версией Lua.

person prapin    schedule 29.09.2012