這篇文章源於我看到某乎某使用者覺得lua語法“違反直覺”,我覺得有這感覺源於lua的語法糖,如果流於表面的把這些加糖後的語法往C,C#,java等語義上套確實容易產生誤解。另外xLua群上也經常會問些因為對語法理解問題導致問題。

lua裡頭一些很常見的語法,其實都是加了糖。比如這個:

local

a

=

{}

a。f

=

10

去糖後其實是這樣的,

local

a

=

{}

a

“f”

=

10

去糖後更清晰了,a是table,table本質上就是一個hashmap,我們往一個hashmap裡頭設定了鍵值對。

再看這個:

local

calc

=

{}

function

calc

add

a

b

——語法糖

end

第一次去糖後是這樣:

local

calc

=

{}

calc。add

=

function

a

b

end

再按照文章開篇第一個語法糖再去一次糖,就變成了

local

calc

=

{}

calc

“add”

=

function

a

b

end

所以,仍然是對一個hashmap設定鍵值對,只不過值相對於c/c#/java比較特殊,這是個function(準確來說是一個closure),因為lua裡頭函式是first-class的,可以作為一個普通值來處理。

再來

function

add

a

b

return

a

+

b

end

一次脫糖

add

=

function

a

b

return

a

+

b

end

二次脫糖就比較複雜,分兩種情況:前面有local變數add,前面沒有。

前面有local add,其實就是對add變數的一次賦值,如果沒有,還要脫糖:

_ENV

“add”

=

function

a

b

#>=

lua53

return

a

+

b

end

其實就是對一個特殊的table設定鍵值對。

跟著來一個導致很多人踩坑的冒號語法糖:

calc

add

1

2

——語法糖

脫糖後是這樣的

calc。add

calc

1

2

和冒號語法糖相關的語法糖

function

calc

add

a

b

——語法糖

end

一次脫糖後是這樣

calc。add

=

function

self

a

b

end

注意,你按脫糖後的寫法,那個self你寫啥名字都可以。