为什么这个递归函数参数为nil?

时间:2014-09-03 08:17:18

标签: recursion lua

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

1 个答案:

答案 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