2011-08-25 83 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