2010-08-21 46 views
1

我對使用luaxml解析XML字符串時看到的行爲感到困惑。 lua的文檔指出,調用印刷()上表變量這樣:爲什麼在調用print(sometable)時,Lua中的某些表顯示會有所不同?

print(type(t)) 
print(t) 

會導致類似這樣的輸出:

t2:  table 
t2:  table: 0095CB98 

然而,當我使用luaxml這樣:

require "luaxml" 

s = "<a> <first> 1st </first> <second> 2nd </second> </a>" 
t = xml.eval(s) 

print("t:  ", type(t)) 
print("t:  ", t) 

我得到以下輸出:

t:  table 
t:  <a> 
    <first>1st</first>  
    <second>2nd</second> 
</a> 

爲什麼print(t)不會返回看起來像第一個示例的結果?

回答

5

print函數使用tostring將其參數轉換爲字符串。

tostring是帶一個表,表的元表有一個__tostring字段,然後調用tostring用表作爲參數對應的值,並使用電話作爲其結果的結果。

我懷疑luaxml在從xml.eval(s)返回的表上有這樣一個__tostring metamethod。

+0

我懷疑這種性質的東西是這樣的,但不知道print()以這種方式表現。有沒有辦法在所討論的表格對象上「反射」(不確定這個術語是否有意義)以查看其metamethods? – Gerald 2010-08-21 05:08:36

+0

我會回答我的問題,因爲你的答案上面使我一個解決方案: MT = getmetatable(T) 關鍵,價值成對(MT)做印刷(鍵,值)結束 將打印元方法... 和 setmetatable(t,nil)刪除它,如果需要的話 謝謝! -Gerald – Gerald 2010-08-21 05:19:22

+0

順便說一句,如果有人讀這是使用luaxml請注意,由xml.eval()返回的表索引從0開始,而不是1。 – Gerald 2010-08-21 05:26:37

0

您可以在表的metatable上定義函數__tostring以獲得此結果。當您將該表傳遞給print()時,如果在metatable上有__tostring函數,print()將輸出評估該函數的結果,而不是使用默認方法(它只打印表的內存地址)。

相關問題