Faça arquivar apenas uma vez em lua
Pergunta
Eu queria saber se existe uma maneira de fazer um arquivo Lua apenas uma vez e ter alguma tentativa subsequente de fazer esse arquivo Lua resultará em um NO-OP.
Eu já pensei em fazer algo semelhante ao truque #if/else/elsef de cabeçalho C ++. Estou me perguntando se há uma maneira padrão de implementar isso.
James
Solução
Nós vamos, require
Praticamente faz isso.
require "file" -- runs "file.lua"
require "file" -- does not run the "file" again
Outras dicas
O único problema com o requisito é que ele funcione em nomes de módulos, não nomes de arquivos. Em particular, o requer não lida com nomes com caminhos (embora use o package.path e o package.cpath para localizar módulos no sistema de arquivos).
Se você deseja lidar com nomes com caminhos, pode escrever um invólucro simples para o dofile da seguinte maneira:
do
local cache={}
local olddofile=dofile
function dofile(x)
if cache[x]==nil then
olddofile(x)
cache[x]=true
end
end
end
com base na resposta do LHF, mas utilizando package
, você também pode fazer isso uma vez:
package.preload["something"]=dofile "/path/to/your/file.lua"
e então use:
local x=require "something"
Para obter o pacote pré -carregado novamente. Mas isso é um pouco abusivo ...