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

Foi útil?

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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top