尝试打印_G不起作用

Ale*_*ack 3 lua

根据文档 _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
Run Code Online (Sandbox Code Playgroud)

错误:

_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
Run Code Online (Sandbox Code Playgroud)

RBe*_*eig 5

您也可以使用该table.foreach(t,f)功能。它遍历一个表t,并f使用每个键和值对调用该函数。配合使用以print快速查看:

table.foreach(_G,print)
Run Code Online (Sandbox Code Playgroud)

这在交互式提示符下确实非常方便,因为它相当简洁且易于键入。

C:\ Users \ Ross> lua
Lua 5.1.4版权所有(C)1994-2008 Lua.org,PUC-Rio
> table.foreach(_G,print)
字符串表:005CE3D0
xpcall函数:00717E80
包装表:005CE088
字符串功能:00717DE0
打印功能:00711CB8
操作系统表:005CE358
开箱功能:00717E40
需要功能:00718360
getfenv函数:00711B58
可设置的功能:00717DA0
下一个功能:00711C38
断言功能:00711A38
tonumber函数:00717DC0
io表:005CE218
原始函数:00711CF8
垃圾回收功能:00711A78
可获取的功能:00711B98
模块功能:00718320
原始功能:00711D58
数学表:005CE448
调试表:005CE498
调用函数:00711C78
桌子桌子:005CE128
newproxy函数:00711E10
类型功能:00717E00
协程表:005CDFE8
_G表:00713EC8
选择功能:00711D98
gcinfo函数:00711B18
对函数:00711F98
rawget函数:00711D18
loadstring函数:00711C18
ipairs函数:00711F68
_VERSION Lua 5.1
dofile函数:00711A98
setfenv功能:00717D60
加载功能:00711BD8
错误功能:00711AD8
加载文件功能:00711BB8
>

更新:不幸的是,正如Alexander Gladysh提醒我的那样,该table.foreach功能在Lua 5.1中已被弃用,对当前5.2 Beta版的快速检查显示该功能已在Lua 5.2中删除。就以下方面而言,编写相同的循环很容易pairs

for k,v in pairs(_G) do print(k,v) end
Run Code Online (Sandbox Code Playgroud)

它应该提供与输出相同的输出table.foreach(_G,print)。我要依靠的关键功能print是定义为调用tostring()您传递的每个参数,并tostring()定义为针对每种值返回某种合理的字符串,即使是那些没有很好表示的函数作为字符串。每个平台上的详细信息将有所不同,但是的默认实现tostring()在其字符串结果中包含表或函数的地址,从而使您至少可以认识到_G.os和_G.io是不同的表。

对于更人性化的表格打印,有很多解决方案,从PiL中的示例到几个持久性数据库。就个人而言,我喜欢史蒂夫·多纳万pl.pretty.write()Steve Donavan)的penlight库提供的功能。