I was wondering if there's a way to do a lua file only once and have any subsequent attempts to do that lua file will result in a no-op.
I've already thought about doing something akin to C++ header's #if/else/endif trick. I'm wondering if there's a standard way to implement this.
James
3 Answers 3
well, require pretty much does that.
require "file" -- runs "file.lua"
require "file" -- does not run the "file" again
2 Comments
require doesn't create a module table or return something, require stores true in package.loaded. Otherwise, it stores the value returned by executing the file. The module function interacts with this well. This is all explained in PiL, but the online copy is not as good as the print edition on these details.The only problem with require is that it works on module names, not file names. In particular, require does not handle names with paths (although it does use package.path and package.cpath to locate modules in the file system).
If you want to handle names with paths you can write a simple wrapper to dofile as follows:
do
local cache={}
local olddofile=dofile
function dofile(x)
if cache[x]==nil then
olddofile(x)
cache[x]=true
end
end
end
4 Comments
require"/path/to/file.lua"require "relative/path/to/file" (without .lua), because the default search path includes ./?.lua.based on lhf's answer, but utilising package, you can also do this once:
package.preload["something"]=dofile "/path/to/your/file.lua"
and then use:
local x=require "something"
to get the preloaded package again. but that's a bit abusive...
requirebeforedofile, except you explicitely want to do the whole file on each call