在目录中加载所有 Lua 文件

我试图将指定目录中的每个文件"导入"到一个表中,但是当我查看输出时,它只显示了导入的一个文件。

"导入" 是指 require(dir.."/"..name),这将返回一个值,该值将被放置在 $table 的 "name" 位置上,因此看起来像 $table[name]

我已经编写了以下代码,但它对我而言不起作用。希望有人告诉我我做错了什么。

(以下代码已简化,但包含了与此函数相关的所有文件、结构和代码,同时我插入了 print() 和 printTable() 进行调试)

我在 Debian Jessie 机器上工作

文件结构

~/x/main.lua
~/x/folder/file1.lua
~/x/folder/file2.lua
~/x/folder/file3.lua
~/x/folder/file4.lua
~/x/folder/file5.lua

./main.luaprintTable 脚本

local printTable = require "printTable"

-- 扫描目录并将文件内容(名字、函数(如果是 .lua)、脚本中的文件路径)添加到表中
function appendDir(functiontable,dir)
  for filename in io.popen('dir "'..dir..'" -1'):lines() do
    print(filename)
    local path = dir.."/"..filename
    local name = filename:sub(1,filename:len()-4)
    print(name)
    local tempValue = false
    if filename:sub(filename:len()-3,filename:len()) == ".lua" then tempValue = require(dir.."/"..name) end
    functiontable[name]={["value"]=tempValue,["path"]=path}
    printTable(functiontable)
  end
  print("---")
  printTable(functiontable)
end

local table1 = {}
appendDir(table1,"./folder")

print("")
print("table1:")
printTable(table1)

for key,value in pairs(table1) do
  value.value()
end

./folder/file*.lua 所有文件都以相同的方式构建,只是函数返回不同的字符串。

function func()
  return "$string"
end

return func

以下字符串用于不同的文件,并插入到 $string 位置中

~/x/folder/file1.lua   $string=string of file 1
~/x/folder/file2.lua   $string=string of file 2
~/x/folder/file3.lua   $string=string of file 3
~/x/folder/file4.lua   $string=string of file 4
~/x/folder/file5.lua   $string=string of file 5

现在当我执行 main.lua 脚本时,我得到了以下结果:

~/x $ lua -v
Lua 5.1.5  版权所有 (C) 1994-2012 Lua.org,PUC-Rio
~/x $dir folder -1
file1.lua
file2.lua
file3.lua
file4.lua
file5.lua
~/x $ lua main.lua
file1.lua
file1
[file1][value] ->       类型 == function
[file1][path] ->         == ./folder/file1.lua
file2.lua
file2
[file1][value] ->       类型 == function
[file1][path] ->         == ./folder/file1.lua
file3.lua
file3
[file3][value] ->       类型 == function
[file3][path] ->         == ./folder/file3.lua
file4.lua
file4
[file3][value] ->       类型 == function
[file3][path] ->         == ./folder/file3.lua
file5.lua
file5
[file4][value] ->       类型 == function
[file4][path] ->         == ./folder/file4.lua
---
[file4][value] ->       类型 == function
[file4][path] ->         == ./folder/file4.lua

table1:
[file4][value] ->       类型 == function
[file4][path] ->         == ./folder/file4.lua
点赞
用户4921284
用户4921284

正如 @EgorSkriptunoff 在原帖的评论部分指出的那样,这是在 printTable 函数中的一个 bug,该函数返回到 for 循环而不是内部函数。这已经得到解决并提交到了 Github!

感谢您的帮助!

2016-08-06 20:19:44