tags:

views:

357

answers:

2

Hi,

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

+2  A: 

well, require pretty much does that.

require "file" -- runs "file.lua"
require "file" -- does not run the "file" again
THC4k
Awesome thanks. I kept thinking I needed a module definition for the lua files too for some reason.
jameszhao00
If the file run by `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.
RBerteig
+2  A: 

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
lhf
THC4k's solution above works on files too. If a file is called abc.lua, require('abc') works.
jameszhao00
Yes, but not if you do dofile"/home/lhf/scripts/abc.lua".
lhf