lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


It was thus said that the Great Peter Cawley once stated:
> On Tue, May 10, 2011 at 4:45 PM, Sean Conner <sean@conman.org> wrote:
> > It was thus said that the Great Dave Collins once stated:
> >> I've got a large object which, for convenience of pulling data from it, is self-referencing. (sometimes I need items from a dept, sometimes I need all items).
> >>
> >> Essentially, I've got this:
> >>
> >> Flyer
> >>                 Departments
> >>                                 Dept1
> >>                                                 Item1
> >>                                                 Item2
> >>                                 Dept2
> >>                                                 Item3
> >>                                                 Item4
> >>                 Items
> >>                                 Item1
> >>                                 Item2
> >>                                 Item3
> >>                                 Item4
> >>
> >>
> >> When I need to look inside this table using the following dump_table method, I get infinite recursion.
> >>
> >> Any ideas on how I can add some smarts to my dump_table to defeat the infinite recursion?
> >>
> >> function dump_table(t, prefix)
> >>       if(prefix == nil) then
> >>             prefix = ""
> >>       end
> >>
> >>       local k,v
> >>       for k,v in pairs(t) do
> >>             if(type(v) == "table") then
> >>                   dump_table(v, prefix .. k .. ":")
> >>             else
> >>                   print(prefix .. k .. "=" .. tostring(v))
> >>             end
> >>       end
> >> end
> >
> >  Try the following:
> >
> > do
> >  local did_it_already
> >
> >  function dump_table(t,prefix,initialized)
> >
> >    if not initialized then
> >      did_it_already = {}
> >    end
> >
> >    local prefix = prefix or ""
> >
> >    for k,v in pairs(t) do
> >      if type(v) == 'table' and not did_it_already[v] then
> >        did_it_already[v] = true
> >        dump_table(v,prefix .. k .. ":",true)
> >      else
> >        print(prefix .. k .. "=" .. tostring(v))
> >      end
> >    end
> >  end
> > end
> >
> >  The reason you were seeing infinite recursion was because of nested
> > tables.  This routine keeps track of any tables already processed and skips
> > them.
> >
> >  -spc
> >
> 
> Isn't that going to have problems if you ever want to dump the same
> table more than once?

  Nope.  You call it like:

	dump_table(_G) -- for example

prefix is nil, so the line

	local prefix = prefix or ""

will be set to an empty string.  initialized is also nil at this point, so
the fragment:

	if not initialized then
          did_it_already = {}
        end

will execute, resetting the list of tables visited.  Subsequent calls to
dump_table() within dump_table() explicitly pass in prefix and initialized.

  -spc