2011-08-25 84 views
3

根据documentation _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 
+2

另请参阅http://www.lua.org/cgi-bin/demo?globals – lhf

+0

你知道,传统的做法是标出接受解决方案的人的答案。 – Puppy

回答

3

你的代码工作完全一样expected-它遍历_G并尝试打印内容。不幸的是,_G包含很多不能连接成字符串的表。代码失败,因为_G [“_ G”] = _G。这意味着,在翻译时谈到

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

则k是“_G”和_G [k]为_G,并尝试连接一表 - 其解释无法做到的,所以它死你。 _G中还有许多其他表格,这也会导致此失败。

+0

它不一定是“_G”键:可以是任何标准库(字符串,表格等);甚至是全球化的他都是自己创造的。 – daurnimator

2

要跟进DeadMG,改变你的

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

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

,你应该罚款。

+2

你也可以打印'v'而不是'_G [k]'。 –

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

更新:不幸的是,亚历山大Gladysh让我想起,在table.foreach功能已被废弃在Lua 5.1和5.2的最新测试版本的快速检查表明,它已经在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's penlight库提供的pl.pretty.write()函数。

+1

请注意'table.foreach()'在5.1 –

+0

中已被弃用是的,我应该提到这一点。它是一种耻辱,因为它在交互式提示中进行这种快速检查非常方便。 – RBerteig