试图打印_G不起作用。

根据文档\_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

原文链接 https://stackoverflow.com/questions/7190794

点赞
stackoverflow用户298661
stackoverflow用户298661

你的代码完全按照预期工作 - 它循环遍历 _G 并尝试打印内容。不幸的是,_G 包含许多无法连接成字符串的表格。代码失败是因为 _G["_G"] = _G。这意味着当解释器来到

print("G["..k.."]=".._G[k])

那么 k 就是 "_G",_G[k] 是 _G,你尝试连接一个表 - 解释器无法这样做,因此它会在你的代码中崩溃。_G 中有许多其他表格也会导致这种失败。

2011-08-25 13:09:36
stackoverflow用户444060
stackoverflow用户444060

为了继续像 DeadMG 一样,将你的

print("G["..k.."]=".._G[k])

改成

print("G["..k.."]=",_G[k])

你就可以了。

2011-08-25 13:17:03
stackoverflow用户796584
stackoverflow用户796584

以下是使用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
2011-08-25 13:19:52
stackoverflow用户68204
stackoverflow用户68204

你也可以使用 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 中被弃用,在 Lua 5.2 的当前测试版中已经被删除。可以很容易地在 pairs 的术语中编写相同的循环:

for k, v in pairs(_G) do print(k, v) end

它应该输出与 table.foreach(_G, print) 相同的内容。我依赖的关键特性是 print 被定义为在传递每个参数时调用 tostring(),而 tostring() 被定义为为每种值都返回某种合理的字符串,甚至对于像函数这样的没有好的字符串表示形式的值也是如此。细节因平台而异,但 tostring() 的默认实现包括在其字符串结果中包含表或函数的地址,允许您至少确认 _G.os 和 _G.io 是不同的表。

对于更人性化的表打印,有许多解决方案,从 PiL 的示例到几个持久性数据库。个人而言,我喜欢由 steve donavan 的 penlight 提供的 pl.pretty.write() 函数。

2011-08-26 02:08:24