根据documentation _G“掌握全球环境”。我想看看里面有什么,所以我写了下面的代码来打印_G,但它不起作用:
function f(x)
return 2*x
end
a=3
b="hello world"
print("_G has "..#_G.." elements")
for k,v in pairs(_G) do
print(k)
print(_G[k])
print("G["..k.."]=".._G[k])
end
错误:
_G has 0 elements
a
3
G[a]=3
string
table: 003C8448
lua: try_G.lua:10: attempt to concatenate field '?' (a table value)
stack traceback:
try_G.lua:10: in main chunk
[C]: ?
>Exit code: 1
答案 0 :(得分:4)
您也可以使用table.foreach(t,f)
功能。它遍历表t
,使用每个键和值对调用函数f
。与print
一起使用可快速查看:
table.foreach(_G,print)
这在交互式提示下非常方便,因为它非常简洁且易于打字。
C:\Users\Ross>lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio > table.foreach(_G,print) string table: 005CE3D0 xpcall function: 00717E80 package table: 005CE088 tostring function: 00717DE0 print function: 00711CB8 os table: 005CE358 unpack function: 00717E40 require function: 00718360 getfenv function: 00711B58 setmetatable function: 00717DA0 next function: 00711C38 assert function: 00711A38 tonumber function: 00717DC0 io table: 005CE218 rawequal function: 00711CF8 collectgarbage function: 00711A78 getmetatable function: 00711B98 module function: 00718320 rawset function: 00711D58 math table: 005CE448 debug table: 005CE498 pcall function: 00711C78 table table: 005CE128 newproxy function: 00711E10 type function: 00717E00 coroutine table: 005CDFE8 _G table: 00713EC8 select function: 00711D98 gcinfo function: 00711B18 pairs function: 00711F98 rawget function: 00711D18 loadstring function: 00711C18 ipairs function: 00711F68 _VERSION Lua 5.1 dofile function: 00711A98 setfenv function: 00717D60 load function: 00711BD8 error function: 00711AD8 loadfile function: 00711BB8 >
更新:不幸的是,正如Alexander Gladysh提醒我的那样,table.foreach
函数在Lua 5.1中已被弃用,并快速检查5.2的当前beta版本,表明它已被删除在Lua 5.2。根据{{1}}:
pairs
应该提供与for k,v in pairs(_G) do print(k,v) end
相同的输出。我在这里关注的一个关键特性是table.foreach(_G,print)
被定义为在你传递的每个参数上调用print
,并且tostring()
被定义为为每种类型返回某种合理的字符串有价值的,甚至那些像字符串一样没有良好表示的函数。每个平台的细节都不同,但tostring()
的默认实现包括其字符串结果中的表或函数的地址,使您至少可以识别_G.os和_G.io distinct 表。
对于更人性化的表格打印,有很多解决方案,从PiL中的示例到几个持久性数据库。就个人而言,我喜欢pl.pretty.write()
库提供的steve donavan's penlight功能。
答案 1 :(得分:3)
您的代码完全按预期工作 - 它循环遍历_G并尝试打印内容。不幸的是,_G包含许多不能连接成字符串的表。代码失败,因为_G [“_ G”] = _G。这意味着当翻译来到时
print("G["..k.."]=".._G[k])
然后k是“_G”而_G [k]是_G,并且你试图连接一个表 - 解释器不能做,所以它就死了。 _G中还有许多其他表也会导致这种失败。
答案 2 :(得分:2)
要跟进DeadMG,请更改
print("G["..k.."]=".._G[k])
到
print("G["..k.."]=",_G[k])
你应该没事。
答案 3 :(得分:1)
以下是使用DeadMG解决方案的最终代码:
function f(x)
return 2*x
end
a=3
b="hello world"
print("_G has "..#_G.." elements")
for k,v in pairs(_G) do
if k~="_G" then
if type(v)=="string" or type(v)=="number" then
print("G["..k.."]="..v)
else
print("G["..k.."]=("..type(v)..")")
end
end
end