2010-12-22 69 views
12

假設你想創建一個Lua表,並且它的所有關鍵字都是有效的lua標識符。然後你可以使用key=value語法:Lua:使用字符串鍵創建隱式表 - 爲什麼額外的括號?

local niceTable = { I=1, like=1, this=1, syntax=1 } 

然而,如果你的字符串是不是「身份」,那麼你必須使用['key']=value語法:

local operators = { ['*']="Why", ['+']="the", ['/']="brackets", ['?']='?' } 

我有點困惑這個問題。那裏有什麼括號?他們的意思是什麼?

回答

18

他們將包含的字符串標識爲結果表中的鍵。第一種形式,你可以考慮爲等於

local niceTable = {} 
niceTable.I = 1; 
niceTable.like = 1; 

第二種形式是等於

local operators = {} 
operators['*'] = "Why"; 
operators['+'] = "The"; 

不同的是純粹的語法糖的,除非第一個使用標識符,所以它必須遵循標識符規則(例如,不以數字和解釋時間常量開頭),第二種形式使用任何舊字符串,因此可以在運行時確定,例如,以及不是合法標識符的字符串。但是,結果基本相同。括號的需要很容易解釋。

local var = 5; 
local table = { 
    var = 5; 
}; 
-- table.var = 5; 

這裏,var是標識符,而不是變量。

local table = { 
    [var] = 5; 
}; 
-- table[5] = 5; 

這裏,VAR是變量,而不是標識符。

+0

因此,它基本上是一種區分「var的值」和「var value」的句法方式:)感謝您的回答,我認爲我現在知道了。我認爲我更喜歡Ruby的做事方式(它總是需要完整的密鑰,沒有快捷方式,但有可識別字符串的快捷方式) – kikito 2010-12-24 03:25:55

17

索引表的正常語法是t[val]。僅對於字符串鍵,Lua提供備用語法,其中t.foo完全等效於t["foo"]。這純粹是一種語法上的便利,即所謂的「語法糖」。它不添加功能,它只是給你一個更簡單的使用字符串作爲命名字段的語法。

有很多串鑰匙,這將不工作:

t["hello_world"] => t.hello_world -- works 
t["hello world"] => t.hello world -- oops, space in the string 
t["5 * 3"]  => t.5 * 3  -- oops 
t['[10]']  => t.[10]   -- oops 

基本上,如果字符串鍵將是一個有效的標識符纔有效。

再次,表是通過[]索引,並且在大多數情況下,你需要使用:只有當你使用一個字符串鍵這將工作作爲一個有效的標識符(無空格

t = { 
    -- [key]   = value 
    [10]    = "ten", -- number key, string value 
    ["print function"] = print, -- string key, function value 
    ["sub table"]  = {}, -- string key, table value 
    [print]   = 111, -- function key, number value 
    ["foo"]   = 123, -- string key, number value 
} 

,包含只有單詞字符,數字或下劃線,並且不以數字開頭)可以使用快捷方式語法。對於上表,這將只是'foo':

t = { 
    -- [key]   = value 
    [10]    = "ten", -- number key, string value 
    ["print function"] = print, -- string key, function value 
    ["sub table"]  = {}, -- string key, table value 
    [print]   = 111, -- function key, number value 
    foo    = 123, -- string key, number value 
} 
+0

[= [[print] = 111, - table key,number value] =] 應該是功能鍵:) – daurnimator 2010-12-23 08:19:00

相關問題