2013-09-30 63 views
4

我正在學習在Lua中編寫代碼,並遇到了一個與我的代碼有關的問題,這是我第一次使用表格,並且每當我在另一個表格中調用特定的表時,我都會得到nil類型並且打印表格不會顯示table:xxxxx,因爲它通常會(它只是打印一個空白),我假設這意味着我在定義表格時做了一些錯誤?Lua Table in Table Showing as Nil

代碼:

local craft = { sword = { "cobble", stick = {} } } 

print(type(craft.sword[1])) 
print(craft.sword[1]) 
print(type(craft.sword[2])) 
print(craft.sword[2]) 
print(craft) 

(這是表的簡化版本,來測試這個錯誤,但它仍然會出現在這裏)

輸出:

string 
cobble 
nil 

table: 8a3b983 
+0

您是否使用標準的Lua解釋器?第四個'print'的輸出應該是'nil',而不是空行。 –

+0

不,我正在使用Minecraft的「Computercraft」mod,我猜測它使用了一個定製的解釋器。 – BenneyBoy444

+0

然後,您應該編輯您的問題以添加該信息以供將來參考。當你這樣做時,我們都可以刪除我們的評論來清理線程。 –

回答

5

craft.sword包含密鑰1"stick",而不是12。你所做的相當於:

local craft = {} 
craft.sword = {} 
craft.sword[1] = "cobble" 
craft.sword.stick = {} 

請注意,在craft.sword [2]中沒有任何東西存儲。

更一般地,如果聲明使用值,但沒有鑰匙,一臺在{ "one", "two", "three" },這將它們分配給數字索引,從1開始。如果你聲明使用它的鍵和值,如{ first = "one", second = "two", third = "three" },這些值存儲只有在您指定的鍵中,並且沒有任何內容自動存儲在數字索引中。如果您將它們混合在一起(如{ "cobble", stick = {} }),那麼沒有密鑰的值("cobble")會自動分配給數字索引,並且那些會(stick = {})分配給您指定的密鑰。

表格聲明如何工作的完整規範在the manual under Table Constructors中進行了說明。

+0

謝謝,我只是從程序中的代碼中刪除了'stick =',它完美地工作!對我而言,現在看起來很明顯,我做錯了什麼,但是我不能爲我的生活找出自己錯了什麼:) – BenneyBoy444

1

您的表sword在表craft中有類似數組的部分和類似散列部分的混合索引。所以

local craft = { sword = { "cobble", stick = {} } } 

相當於

local craft = { sword = { 1 = "cobble", stick = {} } } 

或(stick是一個字符串索引)

local craft = { sword = { [1] = "cobble", ["stick"] = {} } } 

如果你需要把匿名錶中的索引2,你可以用它像這樣:

local craft = { sword = { "cobble", { stick = {} } } } 
--        ^  ^

您的測試代碼在我的機器上的輸出:

string 
cobble 
table 
table: 003CA158 
table: 003CB0C8