试图打印_G不起作用

时间:2011-08-25 13:00:18

标签: lua

根据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

4 个答案:

答案 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