這篇文章源於我看到某乎某使用者覺得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你寫啥名字都可以。