[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Error using lua-users wiki sample Dir Tree Iterator code
- From: Tom N Harris <telliamed@...>
- Date: Thu, 12 Mar 2015 14:39 -0400
On Thursday, March 12, 2015 01:37:10 PM mchalkley@mail.com wrote:
> When trying to use the first version of the "Dir Tree Iterator" sample
> code on the lua-user.org Wiki page[1], I get the error:
>
> attempt to call field '?' (a userdata value)
>
> for this line:
> local entry = diriters[#diriters]()
>
> The second example, using coroutines, works fine.
>
> What's the issue with the first example?
>
I believe LFS changed the way the lfs.dir function works. When this was
written it must have only returned a unique closure for each directory. Now it
uses an iterator function with state in a userdata. If you want to stare the
iterator in a table you need to wrap it in a closure.
> local diriters = {lfs.dir(dir)}
and
> table.insert(diriters, lfs.dir(filename))
Change to
local diriters = {diriterator(lfs.dir(dir))}
table.insert(dirieters, diriterator(lfs.dir(filename)))
And add this function
local function diriterator(func, state)
return function()
return func(state)
end
end
That will do for lfs.dir which doesn't use the counter variable. There's
another wrapper that works with any iterator, but that's an exercise for the
reader.
--
tom <telliamed@whoopdedo.org>