2009-09-02 2 views
3

Мне было интересно, есть ли способ сделать файл lua только один раз и какие-либо последующие попытки сделать этот lua-файл приведет к созданию no-op.Делать файл только один раз в Lua

Я уже думал о том, чтобы сделать что-то похожее на трюк # if/else/endif заголовка C++. Мне интересно, есть ли стандартный способ реализовать это.

Джеймс

+0

Что вы подразумеваете под "do lua file"? – 2009-09-02 19:28:42

+0

Я использую dofile() в данный момент из нескольких мест по 1 файлу. – jameszhao00

+0

Я всегда предпочитаю 'require' перед' dofile', за исключением того, что вы явно хотите * делать весь файл при каждом вызове * – nonchip

ответ

11

хорошо, require довольно много делает.

require "file" -- runs "file.lua" 
require "file" -- does not run the "file" again 
+0

Удивительная благодарность. Я по-прежнему думал, что по какой-то причине мне нужно определение модуля для файлов lua. – jameszhao00

+2

Если файл, выполняемый 'require', не создает таблицу модулей или ничего не возвращает,' require' сохраняет 'true' в' package.loaded'. В противном случае он сохраняет значение, возвращаемое при выполнении файла. Функция «модуль» взаимодействует с этой скважиной. Все это объясняется в PiL, но онлайн-копия не так хороша, как печатное издание по этим деталям. – RBerteig

2

Единственная проблема с требованием заключается в том, что он работает с именами модулей, а не с именами файлов. В частности, require не обрабатывает имена с путями (хотя он использует package.path и package.cpath для поиска модулей в файловой системе).

Если вы хотите обрабатывать имена с путями вы можете написать простую обертку для dofile следующим образом:

do 
    local cache={} 
    local olddofile=dofile 
    function dofile(x) 
    if cache[x]==nil then 
     olddofile(x) 
     cache[x]=true 
    end 
    end 
end 
+0

Решение THC4k выше работает и с файлами. Если файл называется abc.lua, то требуется (abc). – jameszhao00

+1

Да, но нет, если вы делаете файл "/home/lhf/scripts/abc.lua". – lhf

+0

На самом деле вы также можете использовать 'require '/path/to/file.lua" ' – nonchip

0

на основе ответа LHF, но с использованием package, вы также можете сделать это один раз:

package.preload["something"]=dofile "/path/to/your/file.lua" 

, а затем использовать:

local x=require "something" 

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

Смежные вопросы