2014-09-03 68 views
2

walk是一个递归函数,它可以遍历给定的树,并且如果遍历文件对它做些什么。 应该改变“用它做什么”。 我可以在步行中使用coroutine.yield(f),但我首先想知道我的错误。为什么这个递归函数参数nil?

正如您所见,参数lootfunc由参考文献给出,应在walk内调用。 但它给了我下面看到的错误。那么为什么参数lootfuncnil

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]: ? 

回答

4

要调用的函数walkwalk(f),只有一个参数,第二个参数填充nil,所以更改:

if attr.mode == "directory" then 
    walk(f) -- next round 

if attr.mode == "directory" then 
    walk(f, lootfunc) -- next round