walk
是一个递归函数,它遍历给定的树,如果遍历文件,则执行某些操作。
"用它做点什么"应该改变。
我可以在步行中使用coroutine.yield(f)
,但我想先知道我的错误。
如您所见,参数lootfunc
由参考提供,应在walk
内调用。
但它给了我下面看到的错误。那么为什么参数lootfunc
nil
?
local KEYWORDS = {
"%.db[x]?",
"%.ojsn",
}
local function loot(d)
if MATCH == "path" then -- only look to the path not to the content
for i,keyword in pairs(KEYWORDS) do
if string.find(d,keyword) then
--coroutine.yield(d)
print(d)
end
end
end
end
local function walk (path,lootfunc)
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local f = path..'/'..file
local attr = lfs.attributes (f)
if(type(attr) == "table") then
if attr.mode == "directory" then
walk (f) -- next round
elseif attr.mode == "file" then
lootfunc(f)
end
end
end
end
end
walk("/path/",loot)
shadowed.lua:73: attempt to call local 'lootfunc' (a nil value)
stack traceback:
(command line):1: in function 'lootfunc'
shadowed.lua:73: in function 'walk'
shadowed.lua:71: in function 'walk'
shadowed.lua:71: in function 'walk'
shadowed.lua:88: in main chunk
[C]: in function 'dofile'
(command line):1: in function <(command line):1>
[C]: in function 'xpcall'
(command line):1: in main chunk
[C]: ?
答案 0 :(得分:4)
你在函数walk(f)
中调用walk
,只有一个参数,第二个参数用nil
填充,所以改变:
if attr.mode == "directory" then
walk(f) -- next round
到
if attr.mode == "directory" then
walk(f, lootfunc) -- next round