【问题标题】:Do file only once in Lua在 Lua 中只做一次文件
【发布时间】:2010-11-25 01:46:42
【问题描述】:

我想知道是否有一种方法可以只执行一次 lua 文件,并且后续尝试执行该 lua 文件将导致无操作。

我已经考虑过做一些类似于 C++ 标头的 #if/else/endif 技巧的事情。我想知道是否有标准的方法来实现这一点。

詹姆斯

【问题讨论】:

  • “做一个lua文件”是什么意思?
  • 我现在在 1 个文件的多个位置使用 dofile()。
  • dofile 之前,我总是更喜欢require,除非你明确地想要在每次通话时完成整个文件

标签: lua luajit


【解决方案1】:

嗯,require 几乎就是这样做的。

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

【讨论】:

  • 非常感谢。由于某种原因,我一直认为我也需要为 lua 文件定义模块。
  • 如果require 运行的文件没有创建模块表或返回一些东西,requiretrue 存储在package.loaded 中。否则,它存储通过执行文件返回的值。 module 函数与此很好地交互。这在 PiL 中都有解释,但在这些细节上,在线副本不如印刷版。
【解决方案2】:

require 的唯一问题是它适用于模块名,而不是文件名。特别是,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

【讨论】:

  • THC4k 的上述解决方案也适用于文件。如果文件名为 abc.lua,则 require('abc') 有效。
  • 是的,但如果你做 dofile"/home/lhf/scripts/abc.lua".
  • 其实你也可以用require"/path/to/file.lua"
  • 好的,抱歉,记错了。你可以做的是require "relative/path/to/file"(不带.lua),因为默认搜索路径包括./?.lua
【解决方案3】:

基于 lhf 的回答,但利用package,您也可以这样做一次:

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

然后使用:

local x=require "something"

再次获取预加载的包。但这有点辱骂...

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多