table作为lua唯一的数据结构,在调试时我们时常需要查看某变量的值,此时希望将此值打印出来,下面以打印全局变量_G为例说明打印table需要注意的事项:
1. table中某键值含有自循环,如a={1,2}, a[3]=a这样的形式,尤其lua的全局变量_G中含有键(域)_G,这说明如果处理不好这种情况,会出现死循环情况,如a[3]={1,2,{1,2},...},此时需要存储已读取的键值信息,再以后的读取键值过程中,如果出现同样的值,则以以往出现过的键名来代替,如a[3]=a
2.输出信息尽可能的清晰,变量之间关系要层次话。
为此编写了函数echo,用于对table的显示输出。
function echo(t,n,saved)
saved = saved or {}
n = n or 0
for k in pairs(t) do
local str = ''
if n~=0 then
local fmt = '%' .. 2*n .. 's'
str = string.format(fmt, '')
end
io.write(str,tostring(k), ' = ')
if type(t[k])=='table' then
local m = n
m = m+1
if saved[t[k]] then
io.write(saved[t[k]], '\n')
else
saved[t[k]] = k
io.write('{\n')
echo(t[k], m, saved)
io.write(str,'}\n')
end
else
io.write(tostring(t[k]),'\n')
end
end
end
测试echo(_G)如下:
string = {
sub = function: 003E8038
upper = function: 003E8078
len = function: 003E7EF8
gfind = function: 003E7E78
rep = function: 003E7FB8
find = function: 003E7DB8
match = function: 003E7F78
char = function: 003E7D38
dump = function: 003E7D78
gmatch = function: 003E7E78
reverse = function: 003E7FF8
byte = function: 003E7CF8
format = function: 003E7DF8
gsub = function: 003E7EB8
lower = function: 003E7F38
xpcall = function: 003E5368
package = {
preload = {
loadlib = function: 003E5888
loaded = {
string = string
debug = {
getupvalue = function: 003E92C8
debug = function: 003E9158
sethook = function: 003E9330
getmetatable = function: 003E92A8
gethook = function: 003E9198
setmetatable = function: 003E93B8
setlocal = function: 003E9370
traceback = function: 003E9420
setfenv = function: 003E9310
getinfo = function: 003E91D8
setupvalue = function: 003E93D8
getlocal = function: 003E9218
getregistry = function: 003E9260
getfenv = function: 003E9178
package = package
_G = {
string = string
xpcall = function: 003E5368
package = package
tostring = function: 003E52A0
print = function: 003E4C80
loadlib = function: 003E5888
os = {
exit = function: 003E7AE8
setlocale = function: 003E7BC8
date = function: 003E7618
getenv = function: 003E7B28
difftime = function: 003E7658
remove = function: 003E7B68
time = function: 003E7C10
clock = function: 003E75D8
tmpname = function: 003E7C50
rename = function: 003E7B88
execute = function: 003E7AA8
unpack = function: 003E5328
require = function: 003E4D88
getfenv = function: 003E48A0
setmetatable = function: 003E5210
next = function: 003E4C00
assert = function: 003E4650
tonumber = function: 003E5258
io = {
lines = function: 003E7008
write = function: 003E7168
close = function: 003E6F80
flush = function: 003E6FA0
open = function: 003E7028
output = function: 003E7068
type = function: 003E7148
read = function: 003E70E8
stderr = file (77C2FCC0)
stdin = file (77C2FC80)
input = function: 003E6FC0
stdout = file (77C2FCA0)
popen = function: 003E70A8
tmpfile = function: 003E7108
rawequal = function: 003E4CC0
collectgarbage = function: 003E4690
getmetatable = function: 003E48E0
module = function: 003E5D30
rawset = function: 003E4D48
echo = function: 003EE168
tout = function: 003EE148
math = {
log = function: 003E8938
max = function: 003E8978
acos = function: 003E85B8
huge = 1.#INF
ldexp = function: 003E88B8
pi = 3.1415926535898
cos = function: 003E8738
tanh = function: 003E8C00
pow = function: 003E8A38
deg = function: 003E8778
tan = function: 003E8C40
cosh = function: 003E86F8
sinh = function: 003E8B40
random = function: 003E8AB8
randomseed = function: 003E8AF8
frexp = function: 003E8878
ceil = function: 003E86B8
floor = function: 003E87F8
rad = function: 003E8A78
abs = function: 003E8578
sqrt = function: 003E8BC0
modf = function: 003E89F8
asin = function: 003E85F8
min = function: 003E89B8
mod = function: 003E8838
fmod = function: 003E8838
log10 = function: 003E88F8
atan2 = function: 003E8638
exp = function: 003E87B8
sin = function: 003E8B80
atan = function: 003E8678
debug = debug
pcall = function: 003E4C40
table = {
setn = function: 003E65F8
insert = function: 003E6578
getn = function: 003E5100
foreachi = function: 003E50B8
maxn = function: 003E5140
foreach = function: 003E5078
concat = function: 003E5038
sort = function: 003E6638
remove = function: 003E65B8
_VERSION = Lua 5.1
type = function: 003E52E8
newproxy = function: 003E5540
coroutine = {
resume = function: 003E5628
yield = function: 003E5728
status = function: 003E56A8
wrap = function: 003E56E8
create = function: 003E55E8
running = function: 003E5668
select = function: 003E5190
_G = _G
gcinfo = function: 003E4860
rawget = function: 003E4D08
loadstring = function: 003E4BB8
pairs = function: 003E5480
ipairs = function: 003E5410
dofile = function: 003E46D8
setfenv = function: 003E51D0
load = function: 003E4B78
error = function: 003E4718
loadfile = function: 003E4928
io = io
os = os
table = table
math = math
coroutine = coroutine
loaders = {
1 = function: 003E59B8
2 = function: 003E59D8
4 = function: 003E5A18
3 = function: 003E59F8
cpath = .\?.dll;E:\lua-5.1.4\?.dll;E:\lua-5.1.4\loadall.dll
config = \
?
-
path = .\?.lua;E:\lua-5.1.4\lua\?.lua;E:\lua-5.1.4\lua\?\init.lua;E:\lua-
\?.lua;E:\lua-5.1.4\?\init.lua
seeall = function: 003E58C8
tostring = function: 003E52A0
print = function: 003E4C80
loadlib = function: 003E5888
os = os
unpack = function: 003E5328
require = function: 003E4D88
getfenv = function: 003E48A0
setmetatable = function: 003E5210
next = function: 003E4C00
assert = function: 003E4650
tonumber = function: 003E5258
io = io
rawequal = function: 003E4CC0
collectgarbage = function: 003E4690
getmetatable = function: 003E48E0
module = function: 003E5D30
rawset = function: 003E4D48
echo = function: 003EE168
tout = function: 003EE148
math = math
debug = debug
pcall = function: 003E4C40
table = table
_VERSION = Lua 5.1
type = function: 003E52E8
newproxy = function: 003E5540
coroutine = coroutine
select = function: 003E5190
_G = _G
gcinfo = function: 003E4860
rawget = function: 003E4D08
loadstring = function: 003E4BB8
pairs = function: 003E5480
ipairs = function: 003E5410
dofile = function: 003E46D8
setfenv = function: 003E51D0
load = function: 003E4B78
error = function: 003E4718
loadfile = function: 003E4928